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
Fine grain 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 don t use shared resources
synchronized(ylock) {
//access y here
}
}
public void bar() {
synchronized(this) {
//access both x and y here
}
//do something here but don t use shared resources
}
}
lishixinzhi/Article/program/Java/gj/201311/27267