Java如何處理多線程的數據同步問題


在這里寫這種文章好奇怪,先用作筆記吧

Java中有如下的方法來處理代碼塊的並發訪問問題:
一是關鍵字synchronized
二是加鎖(鎖對象,條件對象)

Java給每一個對象都提供了一個內部鎖,在方法的定義中加上關鍵字synchronized后,那么對象的鎖將保護整個方法。也就是說下面兩種寫法是等價的:
public synchronized void method()
{
......
}

public void method()
{
this.intrinsickLock.lock();
try
{
......
}
finally
{
this.intrinsickLock.unlock;
}
}

Java Core中對以上兩種方式都不推薦!

關鍵詞synchronized解讀:
synchronized實現原理就是Java為每一個對象都內置了一個鎖。對於一個類的普通方法來說,synchronized鎖住的是每一個new出來的對象的方法,比如說對於如下代碼:
public class Test{
    public void synchronized testMethod()
   {
     .......
   }
}

Test obj1 = new Test();
Test obj2 = new Test();
如果Thread-1 訪問的是obj1,Thread-2訪問的是obj2,那么兩個線程都不會阻塞,因為這是兩個不同的對象。
如果Thread-1 訪問的是obj1,Thread-2訪問的也是obj1,那么Thread-2會阻塞,因為兩個線程訪問的是同一個的對象,但是Thread-1先獲取了鎖,所以Thread-2必須等到Thread-1釋放了鎖,才能訪問。

對於一個靜態方法而言,synchronized則成為了一個類鎖,對於上面所描述的場景,兩種情況下,Thread-2都會被阻塞,因為靜態方法是類的所有對象都共享的。

synchronized除了能鎖整個方法之外,也能鎖代碼塊。
一種寫法是:
public void method()
{
    synchronized(this)
  {
    ....
  }
.....
}
另外一種寫法是:
Object obj = new Object();
public void method()
{
    synchronized(obj)
  {
    ....
  }
.....
}
第二種寫法更加靈活一些。在用synchronized的時候,需要當心的是過度使用synchronized來進行保護,造成性能的問題。


免責聲明!

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



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