1. 程式人生 > >執行緒併發四:執行緒安全之synchronized

執行緒併發四:執行緒安全之synchronized

關鍵字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();
        }
    }