Java多線程鎖是為了解決數據同步中的數據安全問題下面我們就來詳細的學習下有關於Java多線程鎖的相關問題只有不斷的學習才能不斷的提高自身的相關技術
大多數應用程序要求線程互相通信來同步它們的動作在Java程序中最簡單實現同步的方法就是上Java多線程鎖為了防止同時訪問共享資源線程在使用資源的前後可以給該資源上鎖和開鎖假想給復印機上鎖任一時刻只有一個職員擁有鑰匙若沒有鑰匙就不能使用復印機
給共享變量上Java多線程鎖就使得Java線程能夠快速方便地通信和同步某個線程若給一個對象上了鎖就可以知道沒有其他線程能夠訪問該對象即使在搶占式模型中其他線程也不能夠訪問此對象直到上鎖的線程被喚醒完成工作並開鎖那些試圖訪問一個上鎖對象的線程通常會進入睡眠狀態直到上鎖的線程開鎖一旦鎖被打開這些睡眠進程就會被喚醒並移到准備就緒隊列中
在Java編程中所有的對象都有鎖線程可以使用synchronized關鍵字來獲得鎖在任一時刻對於給定的類的實例方法或同步的代碼塊只能被一個線程執行這是因為代碼在執行之前要求獲得對象的Java多線程鎖繼續我們關於復印機的比喻為了避免復印沖突我們可以簡單地對復印資源實行同步如同下列的代碼例子任一時刻只允許一位職員使用復印資源通過使用方法(在 Copier 對象中)來修改復印機狀態這個方法就是同步方法只有一個線程能夠執行一個Copier對象中同步代碼因此那些需要使用Copier對象的職員就必須排隊等候
class CopyMachine {
public synchronized void makeCopies(Document d int nCopies) {
//only one thread executes this at a time
}
public void loadPaper() {
//multiple threads could access this at once!
synchronized(this) {
//only one thread accesses this at a time
//feel free to use shared resources overwrite members etc
Finegrain Java多線程鎖
在對象級使用鎖通常是一種比較粗糙的方法為什麼要將整個對象都上鎖而不允許其他線程短暫地使用對象中其他同步方法來訪問共享資源?如果一個對象擁有多個資源就不需要只為了讓一個線程使用其中一部分資源就將所有線程都鎖在外面由於每個對象都有Java多線程鎖可以如下所示使用虛擬對象來上鎖
class FineGrainLock {
MyMemberClass x y;
Object xlock = new Object() ylock = new Object();
public void foo() {
synchronized(xlock) {
//access x here
}
//do something here but dont use shared resources
synchronized(ylock) {
//access y here
}
}
public void bar() {
synchronized(this) {
//access both x and y here
}
//do something here but dont use shared resources
}
}
若為了在方法級上同步不能將整個方法聲明為synchronized關鍵字它們使用的是成員Java多線程鎖而不是synchronized方法能夠獲得的對象級鎖
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27267.html