同步方法和同步程式碼塊的使用和區別
阿新 • • 發佈:2019-01-26
同步方法的使用:在方法上加synchronized
public synchronized void execute()
{
for(int i = 0; i < 20; i++)
{
try
{
Thread.sleep((long)(Math.random() * 1000));
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("hello: " + i);
}
}
同步程式碼塊的使用:在可能會出現多執行緒問題的程式碼片段上加上如下程式碼
synchronized(this){
}
this代表當前類所對應的物件
通常我們也可以自己建立物件,然後在同步程式碼塊的引數上傳入該物件,來控制線層的訪問,程式碼如下:
Object object = new Object();
synchronized(object){
}
當有多個執行緒訪問方法時,只有優先搶到鎖的執行緒會將object物件上鎖,那麼其他執行緒就無法再訪問了。
同步程式碼塊
public void execute() { synchronized(this){ for(int i = 0; i < 20; i++) { try { Thread.sleep((long)(Math.random() * 1000)); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("hello: " + i); } } }
同步程式碼塊和靜態同步方法的區別
在實際開發中,可能會出現一個方法只有2、3行程式碼有多執行緒的問題,如果使用同步方法,那麼就會把方法中的所有程式碼都放在同步方法裡面,這樣做不好的地方是,此方法同一時間只允許一個執行緒訪問該方法,其他執行緒無法訪問,這樣會嚴重影響程式碼的執行效率。
如果使用同步程式碼塊,只將可能會出現多執行緒問題的程式碼放在同步程式碼塊裡面,那麼當一個執行緒訪問同步程式碼塊裡面的程式碼時,其他執行緒也可以訪問方法裡其他的程式碼,這樣程式碼執行效率會大大增加。所以,通常情況下,能使用同步程式碼塊就儘量使用同步程式碼塊。