用售票小案例來示範:
注意:票池是共用的,那麼票數一定得是static的!多線程去票池拿票
1.1當用this來做螢幕時(目前對象非static)
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TPR5UMFR1TykkaNBDOsJGcohVYsR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLzQTMzEDNzYTM5ADOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
多次測試未出現資料重複。說明可以啟動同步作用。
1.2.當我新增new Ticket對象,
多次測試出現t和tt重複買票。this未實作同步作用。
說明:this隻是對目前對象執行個體有用,一旦有了新對象則失去效果。
2.1當我用全局變量obj來做螢幕時,
多次測試出現重複買票問題。obj未實作同步作用。
2.2當我把obj設定成全局靜态變量時
多次測試并未出現重複買票問題。靜态全局變量實作同步。
最後,總結一下:
當我們項目有關同步問題時,可以嘗試使用synchronized(obj){}代碼塊。至于未為什麼不直接在方法上加synchronized關鍵字,是因為這個時候整個方法都是同步的,影響效率。使用synchronized(obj){}代碼塊,别的線程是可以通路此方法的,隻是對此代碼塊内同步。obj因為是全局靜态的,擷取的是類鎖。對于this的話,就如我上面說的,在同一個對象執行個體的情況下是同步的,但是不是同一個對象執行個體則失去效果。