java對(duì)象鎖有兩種:對(duì)象鎖单鹿、類鎖馏予。
對(duì)象鎖:在非靜態(tài)方法上加鎖天梧。聲明了一個(gè)對(duì)象鎖。類鎖:在靜態(tài)方法上加鎖霞丧,聲明了一個(gè)類鎖呢岗。
經(jīng)過大量的實(shí)驗(yàn)總結(jié)出以下結(jié)論:
1、想要保證能夠鎖住對(duì)象蛹尝,需要在對(duì)應(yīng)的的普通方法上加上synchronized關(guān)鍵字后豫。
2、想要保證能夠鎖住對(duì)象突那,需要在對(duì)應(yīng)的的普通方法上加上synchronized關(guān)鍵字挫酿。
3、非靜態(tài)函數(shù)用關(guān)鍵字synchronized不會(huì)對(duì)普通方法有影響愕难。
4早龟、普通函數(shù)用關(guān)鍵字synchronized不會(huì)對(duì)靜態(tài)方法有影響。
然后我們來做一個(gè)實(shí)驗(yàn):
1猫缭、我們先聲明一個(gè)類對(duì)象葱弟,
2、聲明了兩個(gè)普通方法猜丹,一個(gè)method1用synchronized關(guān)鍵字修飾芝加,另一個(gè)method2沒有鎖(沒有用synchronized修飾)
3、兩個(gè)函數(shù)都調(diào)用另一個(gè)普通函數(shù)method3射窒,函數(shù)method讓對(duì)象的屬性加一藏杖。循環(huán)一萬次。
4轮洋、有兩個(gè)線程分別執(zhí)行method1和method2制市。那么執(zhí)行結(jié)果是什么呢?
線程類:
package Test;
public class Syn extends Thread{
int i;
private TestSyn syn;
public Syn(int i ,TestSyn syn) {
this.i=i;
this.syn=syn;
}
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(i%2==0) {
syn.method1(syn);
}
else {
syn.method2(syn);
}
}
}
測(cè)試類:
package Test;
public class TestSyn {
private int i;
public TestSyn(int i) {
this.i=i;
}
public synchronized void method1(TestSyn aSyn) {
System.out.println("1");
method3(aSyn);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("變化的i"+aSyn.i);
}
public void method2(TestSyn aSyn) {
System.out.println("2");
method3(aSyn);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("變化的i"+aSyn.i);
}
public void method3(TestSyn aSyn) {
for(int i=0;i<10000;i++) {
aSyn.i++;
}
}
public static void main(String[] args) {
Syn []a = new Syn[2];
TestSyn aSyn=new TestSyn(0);
a[0]=new Syn(1,aSyn);
a[1]=new Syn(2,aSyn);
a[1].start();
a[0].start();
}
}
理論上是20000弊予,實(shí)際上會(huì)少很多祥楣,所以這種方式是線程不安全的。
所以如果想讓兩個(gè)函數(shù)互斥的訪問某些資源,在對(duì)應(yīng)的函數(shù)訪問的時(shí)候都要加上鎖误褪。這樣才能保證數(shù)據(jù)的正確性责鳍。
在此我向大家推薦一個(gè)架構(gòu)學(xué)習(xí)交流群。交流學(xué)習(xí)群號(hào):938837867 暗號(hào):555 里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring兽间,MyBatis历葛,Netty源碼分析,高并發(fā)嘀略、高性能恤溶、分布式、微服務(wù)架構(gòu)的原理帜羊,JVM性能優(yōu)化咒程、分布式架構(gòu)等這些成為架構(gòu)師必備