場景二 synchronized修飾方法

2021-07-06 05:51:53 字數 4189 閱讀 2341

相對於場景一:synchronized包裹**塊,synchronized修飾方法的場景要簡單明朗許多。因為無論被修飾的方法是靜態還是成員,執行緒訪問它時它都只能指定特定的鎖。

而不像synchronized包裹**塊場景下,類a的物件a即可以指定自己為鎖,也可以指定類b的物件b為鎖,也可以指定類a對應的class物件為鎖,也可以指定類b對應的class物件為鎖……簡直生活不能自理 (~﹏~)

假設:有類a,類a物件a,類a同步成員方法 methodmember(),類a同步靜態方法 methodstatic();

先上結論:a.當執行緒需要進入物件a同步成員方法methodmember()時,必須且只能申請methodmember()對應的物件(也即是物件a)作為物件鎖。

b.當執行緒需要進入類a同步靜態方法methodstatic()時,必須且只能申請methodstatic()對應的類(也即是類a)作為類鎖。

乙個執行緒訪問synchronized修飾的成員方法,並成功取得對應的物件a作為鎖。隨後的執行緒想要進入

1)同物件的其他同步成員方法;(現象一)

2)所有以物件a作為物件鎖的同步**塊,無論是否同物件、是否同類、是否處於靜態方法(現象二)

時,均會發生競爭。

a.驗證現象一

為synchronizedverify類新增如下main():

public static void main(string args);

}.start();

new thread();

}.start();

}sv.methodstyle() + sv.methodnormal()輸出(無競爭):

methodstyle:

0 |thread-0

methodnormal:

0 |thread-1

methodnormal:

1 |thread-1

methodstyle:

1 |thread-0

methodnormal:

2 |thread-1

methodstyle:

2 |thread-0

將執行緒二呼叫的方法改為methodcontrast()

sv.methodstyle() + sv.methodcontrast()輸出(競爭):

methodstyle:

0 |thread-0

methodstyle:

1 |thread-0

methodstyle:

2 |thread-0

methodcontrast:

0 |thread-1

methodcontrast:

1 |thread-1

methodcontrast:

2 |thread-1

b.驗證現象二

為synchronizedverify類新增如下main():

public static void main(string args);

}.start();

new thread();

}.start();

}sv.methodstyle() + sv.blockdiffobj()輸出(無競爭):

methodstyle:

0 |thread-0

blockdiffobj:

0 |thread-1

methodstyle:

1 |thread-0

blockdiffobj:

1 |thread-1

methodstyle:

2 |thread-0

blockdiffobj:

2 |thread-1

執行緒二呼叫方法改為:blockoneself()

sv.methodstyle() + sv.blockoneself()輸出(競爭):

methodstyle:

0 |thread-0

methodstyle:

1 |thread-0

methodstyle:

2 |thread-0

blockoneself:

0 |thread-1

blockoneself:

1 |thread-1

blockoneself:

2 |thread-1

其他情況原理類似,不再累述。

乙個執行緒訪問synchronized修飾的靜態方法,並成功取得對應的類a作為鎖。隨後的執行緒想要進入

1)同物件的其他同步靜態方法;(現象三)

2)所有以類a作為類鎖的同步**塊,無論是否同物件、是否同類、是否處於靜態方法(現象四)

時,均會發生競爭。

a.驗證現象三

為synchronizedverify類新增如下main():

public static void main(string args);

}.start();

new thread();

}.start();

}synchronizedverify.methodstatic() + synchronizedverify.methodstaticnormal()輸出(無競爭):

methodstatic:

0 |thread-0

methodstaticnormal:

0 |thread-1

methodstaticnormal:

1 |thread-1

methodstatic:

1 |thread-0

methodstatic:

2 |thread-0

methodstaticnormal:

2 |thread-1

將執行緒二呼叫的方法改為methodstaticcontrast()

synchronizedverify.methodstatic() + synchronizedverify.methodstaticcontrast()輸出(競爭):

methodstatic:

0 |thread-0

methodstatic:

1 |thread-0

methodstatic:

2 |thread-0

methodstaticcontrast:

0 |thread-1

methodstaticcontrast:

1 |thread-1

methodstaticcontrast:

2 |thread-1

b.驗證現象四

為synchronizedverify類新增如下main():

public static void main(string args);

}.start();

new thread();

}.start();

}synchronizedverify.methodstatic() + sv.blockoneself()輸出(無競爭):

methodstatic:

0 |thread-0

blockoneself:

0 |thread-1

methodstatic:

1 |thread-0

blockoneself:

1 |thread-1

methodstatic:

2 |thread-0

blockoneself:

2 |thread-1

執行緒二呼叫方法改為:blockclass()

synchronizedverify.methodstatic() + sv.blockclass()輸出(競爭):

methodstatic:

0 |thread-0

methodstatic:

1 |thread-0

methodstatic:

2 |thread-0

blockclass:

0 |thread-1

blockclass:

1 |thread-1

blockclass:

2 |thread-1

其他情況原理類似,不再累述。

java中synchronized用法(二)

1 synchronized關鍵字的作用域有二種 1 是某個物件例項內,synchronized amethod 可以防止多個執行緒同時訪問這個物件的synchronized方法 如果乙個物件有多個synchronized方法,只要乙個執行緒訪問了其中的乙個synchronized方法,其它執行緒不...

Maya場景渲染(二)

我們知道,用現實的攝像機拍攝的影象之所以好看,很大程度上是因為擁有景深的效果,而maya的攝像機也可以做出同樣的效果。這次我主要使用了景深屬性和玻璃反光材質,先看一下最終效果 首先開啟攝像機選項下的景深屬性,可以看到有很多引數,focus distance的意思就是鏡頭的焦距,maya的乙個單位是一...

執行緒synchronized 例子

public class foo public int fix int y return x public class myrunnable implements runnable catch interruptedexception e system.out.println thread.curr...