JAVA中線程同步的方法(4種)匯總


 

package com.xhj.thread;
 
    /**
     * 線程同步的運用
     * 
     * @author XIEHEJUN
     * 
     */
    public class SynchronizedThread {
 
        class Bank {
            private int account = 100;
            public int getAccount() {
                return account;
            }
 
            /**
             * 1.用同步方法實現
             * 
             * @param money
             */
            public synchronized void save(int money) {
                account += money;
            }
 
            /**
             * 2.用同步代碼塊實現
             * 
             * @param money
             */
            public void save1(int money) {
                synchronized (this) {
                    account += money;
                }
            }
        }

3.wait與notify

wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。

sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。
notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。
Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。

4.使用特殊域變量(volatile)實現線程同步

    a.volatile關鍵字為域變量的訪問提供了一種免鎖機制
    b.使用volatile修飾域相當於告訴虛擬機該域可能會被其他線程更新
    c.因此每次使用該域就要重新計算,而不是使用寄存器中的值 
    d.volatile不會提供任何原子操作,它也不能用來修飾final類型的變量 
    
    例如: 
        在上面的例子當中,只需在account前面加上volatile修飾,即可實現線程同步。 
//只給出要修改的代碼,其余代碼與上同
        class Bank {
            //需要同步的變量加上volatile
            private volatile int account = 100;
 
            public int getAccount() {
                return account;
            }
            //這里不再需要synchronized 
            public void save(int money) {
                account += money;
            }
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM