java中的synchronized關鍵字 用法

2021-05-05 03:59:20 字數 4215 閱讀 1990

1、synchronized關鍵字的作用域有二種:

1)是某個物件例項內,synchronized amethod(){}可以防止多個執行緒同時訪問這個物件的synchronized方法(如果乙個物件有多個synchronized方法,只要乙個線 程訪問了其中的乙個synchronized方法,其它執行緒不能同時訪問這個物件中任何乙個synchronized方法)。這時,不同的物件例項的 synchronized方法是不相干擾的。也就是說,其它執行緒照樣可以同時訪問相同類的另乙個物件例項中的synchronized方法;

2)是某個類的範圍,synchronized static astaticmethod{}防止多個執行緒同時訪問這個類中的synchronized static 方法。它可以對類的所有物件例項起作用。

2、除了方法前用synchronized關鍵字,synchronized關鍵字還可以用於方法中的某個區塊中,表示只對這個區塊的資源實行互斥訪問。用法是: synchronized(this),它的作用域是當前物件;

3、synchronized關鍵字是不能繼承的,也就是說,基類的方法synchronized f(){} 在繼承類中並不自動是synchronized f(){},而是變成了f(){}。繼承類需要你顯式的指定它的某個方法為synchronized方法;

下面是另外乙個人對synchronized關鍵字的進一步理解。

一、當兩個併發執行緒訪問同乙個物件object中的這個synchronized(this)同步**塊時,乙個時間內只能有乙個執行緒得到執行。另乙個執行緒必須等待當前執行緒執行完這個**塊以後才能執行該**塊。

二、然而,當乙個執行緒訪問object的乙個synchronized(this)同步**塊時,另乙個執行緒仍然可以訪問該object中的非synchronized(this)同步**塊。

三、尤其關鍵的是,當乙個執行緒訪問object的乙個synchronized(this)同步**塊時,其他執行緒對object中所有其它synchronized(this)同步**塊的訪問將被阻塞。

四、第三個例子同樣適用其它同步**塊。也就是說,當乙個執行緒訪問object的乙個synchronized(this)同步**塊時,它就獲得了這個object的物件鎖。結果,其它執行緒對該object物件所有同步**部分的訪問都被暫時阻塞。

五、以上規則對其它物件鎖同樣適用.

舉例說明:

一、當兩個併發執行緒訪問同乙個物件object中的這個synchronized(this)同步**塊時,乙個時間內只能有乙個執行緒得到執行。另乙個執行緒必須等待當前執行緒執行完這個**塊以後才能執行該**塊。

package ths;

public class thread1 implements runnable }}

public static void main(string args)

}結果:

a synchronized loop 0

a synchronized loop 1

a synchronized loop 2

a synchronized loop 3

a synchronized loop 4

b synchronized loop 0

b synchronized loop 1

b synchronized loop 2

b synchronized loop 3

b synchronized loop 4

二、然而,當乙個執行緒訪問object的乙個synchronized(this)同步**塊時,另乙個執行緒仍然可以訪問該object中的非synchronized(this)同步**塊。

package ths;

public class thread2 catch (interruptedexception ie) }}

}public void m4t2() catch (interruptedexception ie) }}

public static void main(string args)

}, "t1"

);thread t2 = new thread(

new runnable()

}, "t2"

);t1.start();

t2.start();}}

結果:t1 : 4

t2 : 4

t1 : 3

t2 : 3

t1 : 2

t2 : 2

t1 : 1

t2 : 1

t1 : 0

t2 : 0

三、尤其關鍵的是,當乙個執行緒訪問object的乙個synchronized(this)同步**塊時,其他執行緒對object中所有其它synchronized(this)同步**塊的訪問將被阻塞。

//修改thread2.m4t2()方法:

public void m4t2() catch (interruptedexception ie) }}

}結果:

t1 : 4

t1 : 3

t1 : 2

t1 : 1

t1 : 0

t2 : 4

t2 : 3

t2 : 2

t2 : 1

t2 : 0

四、第三個例子同樣適用其它同步**塊。也就是說,當乙個執行緒訪問object的乙個synchronized(this)同步**塊時,它就獲得了這個object的物件鎖。結果,其它執行緒對該object物件所有同步**部分的訪問都被暫時阻塞。

//修改thread2.m4t2()方法如下:

public synchronized void m4t2() catch (interruptedexception ie) }}

結果:t1 : 4

t1 : 3

t1 : 2

t1 : 1

t1 : 0

t2 : 4

t2 : 3

t2 : 2

t2 : 1

t2 : 0

五、以上規則對其它物件鎖同樣適用:

package ths;

public class thread3 catch(interruptedexception ie) }}

private void m4t2() catch(interruptedexception ie) }}

}private void m4t1(inner inner)

}private void m4t2(inner inner)

public static void main(string args)

}, "t1"

);thread t2 = new thread(

new runnable()

}, "t2"

);t1.start();

t2.start();}}

結果:儘管執行緒t1獲得了對inner的物件鎖,但由於執行緒t2訪問的是同乙個inner中的非同步部分。所以兩個執行緒互不干擾。

t1 : inner.m4t1()=4

t2 : inner.m4t2()=4

t1 : inner.m4t1()=3

t2 : inner.m4t2()=3

t1 : inner.m4t1()=2

t2 : inner.m4t2()=2

t1 : inner.m4t1()=1

t2 : inner.m4t2()=1

t1 : inner.m4t1()=0

t2 : inner.m4t2()=0

現在在inner.m4t2()前面加上synchronized:

private synchronized void m4t2() catch(interruptedexception ie) }}

結果:儘管執行緒t1與t2訪問了同乙個inner物件中兩個毫不相關的部分,但因為t1先獲得了對inner的物件鎖,所以t2對inner.m4t2()的訪問也被阻塞,因為m4t2()是inner中的乙個同步方法。

t1 : inner.m4t1()=4

t1 : inner.m4t1()=3

t1 : inner.m4t1()=2

t1 : inner.m4t1()=1

t1 : inner.m4t1()=0

t2 : inner.m4t2()=4

t2 : inner.m4t2()=3

t2 : inner.m4t2()=2

t2 : inner.m4t2()=1

t2 : inner.m4t2()=0

java中的lock和synchronized區別

1 reentrantlock 擁有synchronized相同的併發性和記憶體語義,此外還多了 鎖投票,定時鎖等候和中斷鎖等候 執行緒a和b都要獲取物件o的鎖定,假設a獲取了物件o鎖,b將等待a釋放對o的鎖定,如果使用 synchronized 如果a不釋放,b將一直等下去,不能被中斷 如果 使用...

Delphi中多執行緒中Synchronize的運用

delphi中多執行緒用synchronize實現vcl資料同步顯示,delphi中多執行緒用synchronize實現vcl資料同步顯示 概述 vcl實現同步的另一種方法就是呼叫執行緒類的synchronize的過程,此過程需要乙個無引數的procedure,故在此procedure中無法傳遞引數...

鎖的分類以及相關講解與synchronized區別

1.鎖的分類 2.深入理解lock介面 lock的使用 lock與synchronized的區別 lock 獲取鎖與釋放鎖的過程,都需要程式設計師手動的控制 lock用的是樂觀鎖方式。所謂樂觀鎖就是,每次不加鎖而是假設沒有衝突而去完成某項操作,如果因為衝突失敗就重試,直到成功為止。樂觀鎖實現的機制就...