天天看點

多線程同步代代碼塊synchronized(this)和synchronized(obj)差別(售票小按例)

用售票小案例來示範:

      注意:票池是共用的,那麼票數一定得是static的!多線程去票池拿票

1.1當用this來做螢幕時(目前對象非static)

多線程同步代代碼塊synchronized(this)和synchronized(obj)差別(售票小按例)
多線程同步代代碼塊synchronized(this)和synchronized(obj)差別(售票小按例)

多次測試未出現資料重複。說明可以啟動同步作用。

1.2.當我新增new Ticket對象,

多線程同步代代碼塊synchronized(this)和synchronized(obj)差別(售票小按例)

多次測試出現t和tt重複買票。this未實作同步作用。

說明:this隻是對目前對象執行個體有用,一旦有了新對象則失去效果。

2.1當我用全局變量obj來做螢幕時,

多線程同步代代碼塊synchronized(this)和synchronized(obj)差別(售票小按例)

多次測試出現重複買票問題。obj未實作同步作用。

2.2當我把obj設定成全局靜态變量時

多線程同步代代碼塊synchronized(this)和synchronized(obj)差別(售票小按例)

多次測試并未出現重複買票問題。靜态全局變量實作同步。

最後,總結一下:

      當我們項目有關同步問題時,可以嘗試使用synchronized(obj){}代碼塊。至于未為什麼不直接在方法上加synchronized關鍵字,是因為這個時候整個方法都是同步的,影響效率。使用synchronized(obj){}代碼塊,别的線程是可以通路此方法的,隻是對此代碼塊内同步。obj因為是全局靜态的,擷取的是類鎖。對于this的話,就如我上面說的,在同一個對象執行個體的情況下是同步的,但是不是同一個對象執行個體則失去效果。

繼續閱讀