相對於場景一: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...