鎖定某物件o,如果o的屬性發生改變,不影響鎖的使用,但是如果o變成另外乙個物件,則鎖定的物件發生改變,應該避免將鎖定物件的引用變成另外乙個物件。
public
class demo17 catch (interruptedexception e)
system.out.println(thread.currentthread().getname());}}
}public
static
void
main(string args) catch (interruptedexception e)
//啟動第二個執行緒
thread t2 = new thread(demo17 :: test, "t2");
demo17.o = new object(); //所物件發生改變,所以t2執行緒得以執行,如果注釋掉這句話,執行緒t2將永遠得不到執行機會
t2.start();
}}
不要以字串常量作為鎖定的物件
在下面的例子中,test1和test2其實鎖定的是同乙個物件
這種情況還會發生比較詭異的現象,比如你用到了乙個類庫,在該類庫中**鎖定了字串」hello」,
但是你讀不到原始碼,所以你在自己的**中也鎖定了」hello」,這時候就有可能發生非常詭異的死鎖阻塞, 因為你的程式和你用的的類庫不經意間使用了同一把鎖。
public
class
demo18
}public
void
test2()
}}
實戰Java高併發程式設計(三)JDK並發包
同步控制 重入鎖 重入鎖可以完全替代synchronized關鍵字。其使用方法如下 public reentrantlock lock new reentrantlock public void run finally 由於其通過人工進行lock和unlock,因此比synchronized更好控制...
Java高併發程式設計筆記
jmm記憶體模型之 可見性 可見性是指當乙個執行緒修改了某乙個共享變數的值,其他執行緒是否能夠立即知道這個修改。jmm記憶體模型之 有序性 有序性問題的原因是因為程式在執行時,可能會出現指令重排,重排後的指令的順序未必一致。一條指令的執行可以分為很多步驟的 簡單來說就是以下幾步 1 取指if 2 解...
Java併發程式設計系列 CountDownLatch
countdownlatch簡介 countdownlatch是基於aqs實現的乙個執行緒同步工具,也稱為閉鎖。它的作用是讓乙個或者多個執行緒等待某個事件的發生。簡單的理解為countdownlatch有乙個正數計數器,countdown方法對計數器做減操作,await方法等待計數器達到0。所有aw...