執行緒併發四:執行緒安全之synchronized
阿新 • • 發佈:2019-01-26
關鍵字synchronized 的作用是實現執行緒間的同步,他的工作是對同步的程式碼加鎖,使得每一次,只能有一個執行緒進入同步塊,從而保證執行緒間的安全性。
關鍵字synchronized可以有多種用法。這裡做簡單的整理
a.指定加鎖物件
b.直接作用於例項方法
c.直接作用於靜態方法
用法很簡單,這裡就不舉例說明了,下面列舉一個很常見的錯誤同步用法
import java.util.Date;
public class SyncThreadTest implements Runnable {
public synchronized void sayHello(){
System.out.println("[" + new Date().getTime() + "]" + Thread.currentThread().getName() + ": say hello!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void run(){
while (true){
sayHello();
}
}
public static void main(String[] args){
Thread t1 = new Thread(new SyncThreadTest(),"test1");
Thread t2 = new Thread(new SyncThreadTest(),"test2");
t1.start();
t2.start();
}
}
可以看出兩個執行緒指向了不同的Runable例項,換而言之,兩個執行緒使用了兩把不同的鎖,因此無法保證執行緒安全。
但是我們只需簡單的修改,就可以正確執行,那就是直接作用於靜態方法,這樣修改之後,兩個執行緒請求的鎖則變為當前類的鎖,而非例項的鎖。
public static synchronized void sayHello(){
System.out.println("[" + new Date().getTime() + "]" + Thread.currentThread().getName() + ": say hello!!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}