熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java線程:線程的同步-同步塊

2013-11-23 18:45:24  來源: Java核心技術 

    對於同步除了同步方法外還可以使用同步代碼塊有時候同步代碼塊會帶來比同步方法更好的效果
 
    追其同步的根本的目的是控制競爭資源的正確的訪問因此只要在訪問競爭資源的時候保證同一時刻只能一個線程訪問即可因此Java引入了同步代碼快的策略以提高性能
 
    在上個例子的基礎上對oper方法做了改動由同步方法改為同步代碼塊模式程序的執行邏輯並沒有問題
 
 


/**
* Java線程線程的同步同步代碼塊
*
* @author leizhimin ::
*/
public class Test {
        public static void main(String[] args) {
                User u = new User(張三 );
                MyThread t = new MyThread(線程A u );
                MyThread t = new MyThread(線程B u );
                MyThread t = new MyThread(線程C u );
                MyThread t = new MyThread(線程D u );
                MyThread t = new MyThread(線程E u );
                MyThread t = new MyThread(線程F u );

                tstart();
                tstart();
                tstart();
                tstart();
                tstart();
                tstart();
        }
}

class MyThread extends Thread {
        private User u;
        private int y = ;

        MyThread(String name User u int y) {
                super(name);
                thisu = u;
                thisy = y;
        }

        public void run() {
                uoper(y);
        }
}

class User {
        private String code;
        private int cash;

        User(String code int cash) {
                de = code;
                thiscash = cash;
        }

        public String getCode() {
                return code;
        }

        public void setCode(String code) {
                de = code;
        }

        /**
         * 業務方法
         *
         * @param x 添加x萬元
         */
        public void oper(int x) {
                try {
                        Threadsleep(L);
                        synchronized (this) {
                                thiscash += x;
                                Systemoutprintln(ThreadcurrentThread()getName() + 運行結束增加 + x + 當前用戶賬戶余額為 + cash);
                        }
                        Threadsleep(L);
                } catch (InterruptedException e) {
                        eprintStackTrace();
                }
        }

        @Override
        public String toString() {
                return User{ +
                                code= + code + \ +
                                 cash= + cash +
                                };
        }
}
 


線程E運行結束增加當前用戶賬戶余額為
線程B運行結束增加當前用戶賬戶余額為
線程D運行結束增加當前用戶賬戶余額為
線程F運行結束增加當前用戶賬戶余額為
線程C運行結束增加當前用戶賬戶余額為
線程A運行結束增加當前用戶賬戶余額為

Process finished with exit code
 
    注意

    在使用synchronized關鍵字時候應該盡可能避免在synchronized方法或synchronized塊中使用sleep或者yield方法因為synchronized程序塊占有著對象鎖你休息那麼其他的線程只能一邊等著你醒來執行完了才能執行不但嚴重影響效率也不合邏輯
    同樣在同步程序塊內調用yeild方法讓出CPU資源也沒有意義因為你占用著鎖其他互斥線程還是無法訪問同步程序塊當然與同步程序塊無關的線程可以獲得更多的執行時間
 
 

  本文出自 熔 巖 博客請務必保留此出處


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25673.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.