synchronized 是控制訪問(wèn)的情況下使用榄笙,說(shuō)人話就是在多個(gè)線程在訪問(wèn)同一個(gè)對(duì)象所做的訪問(wèn)控制,大概說(shuō)一下我了解的synchronized的使用和了解,有錯(cuò)誤的描述懊昨,大家可以指出來(lái),我及時(shí)修改
synchronized是內(nèi)置鎖
簡(jiǎn)單的使用春宣,這是放在方法上的
public synchronized void test() {
}
這是放在對(duì)象上的
public Object object =new Object();
public void test() {
synchronized (object){
}
}
第一段代碼屬于隱式寫法酵颁,它的顯式寫法如下:
public void test() {
synchronized (this){
}
}
其實(shí)上面3段代碼,都是對(duì)象鎖月帝,且效果基本一致躏惋;這些鎖也可以所用于List,String等類型防止并發(fā)訪問(wèn)修改導(dǎo)致的問(wèn)題
接下來(lái)講講在static作用下的
public synchronized void test() {
//這是屬于對(duì)象鎖
}
public synchronized static void test1() {
//這是類鎖嚷辅,其實(shí)也是對(duì)象鎖
}
這2段代碼都是對(duì)象鎖,為什么說(shuō)synchronized 是類鎖呢簿姨,其實(shí)就是偷個(gè)懶,因?yàn)橄喈?dāng)于靜態(tài)方法和成員方法簸搞,我只是不知道該怎么描述扁位;雖然這兩個(gè)都是對(duì)象鎖,但是這兩個(gè)鎖持有的實(shí)例卻不一樣趁俊,因?yàn)殪o態(tài)相當(dāng)于在JDK中有且僅有的一個(gè)域仇,但是成員變量卻不一樣,可能描述的不對(duì)寺擂,大家懂那個(gè)意思就行
分享一下單例寫法
懶漢式殉簸,安全寫法,也是雙重檢查寫法沽讹,這個(gè)也是屬于類鎖
private static volatile Test instance = null;
private static Test getInstance() {
if (instance == null) {
synchronized (Test.class) {
if (null == instance) {
instance = new Test();
}
}
}
return instance;
}
private Test() {
}