1. 程式人生 > >同步方法和同步程式碼塊的使用和區別

同步方法和同步程式碼塊的使用和區別

同步方法的使用:在方法上加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行程式碼有多執行緒的問題,如果使用同步方法,那麼就會把方法中的所有程式碼都放在同步方法裡面,這樣做不好的地方是,此方法同一時間只允許一個執行緒訪問該方法,其他執行緒無法訪問,這樣會嚴重影響程式碼的執行效率。

如果使用同步程式碼塊,只將可能會出現多執行緒問題的程式碼放在同步程式碼塊裡面,那麼當一個執行緒訪問同步程式碼塊裡面的程式碼時,其他執行緒也可以訪問方法裡其他的程式碼,這樣程式碼執行效率會大大增加。所以,通常情況下,能使用同步程式碼塊就儘量使用同步程式碼塊。