Java多線程之synchronized關(guān)鍵字的使用
一、使用在非靜態(tài)方法上
public synchronized void syzDemo(){
System.out.println(System.currentTimeMillis());
System.out.println("進入synchronized鎖:syzDemo");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
二、使用在靜態(tài)方法上
public synchronized static void syzDemo1(){
System.out.println(System.currentTimeMillis());
System.out.println("進入synchronized鎖:syzDemo1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
三、使用在代碼塊上
public synchronized void syzDemo2(){
synchronized (this){
System.out.println(System.currentTimeMillis());
System.out.println("進入synchronized鎖:syzDemo2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public synchronized void syzDemo3(){
synchronized (ExcelUtil.class){
System.out.println(System.currentTimeMillis());
System.out.println("進入synchronized鎖:syzDemo3");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
四、三種方式的區(qū)別
public static void main(String[] args) {
SyzDemo syzDemo = new SyzDemo();
SyzDemo syzDemo1 = new SyzDemo();
Thread thread = new Thread(()->{
syzDemo.syzDemo();
});
thread.start();
Thread thread1 = new Thread(()->{
syzDemo1.syzDemo();
});
thread1.start();
}
4.1 不會互斥
public static void main(String[] args) {
SyzDemo syzDemo = new SyzDemo();
SyzDemo syzDemo1 = new SyzDemo();
Thread thread = new Thread(()->{
syzDemo.syzDemo();
});
thread.start();
Thread thread1 = new Thread(()->{
syzDemo.syzDemo();
});
thread1.start();
}
4.2 互斥
public static void main(String[] args) {
SyzDemo syzDemo = new SyzDemo();
SyzDemo syzDemo1 = new SyzDemo();
Thread thread = new Thread(()->{
syzDemo.syzDemo1();
});
thread.start();
Thread thread1 = new Thread(()->{
syzDemo1.syzDemo1();
});
thread1.start();
}
解析:
在圖1中thread1和thread分別調(diào)用syzDemo和syzDemo1對象中的syzDemo方法,因為兩個線程調(diào)用是不同的對象的兩個方法,所以不會互斥
在圖2中thread1和thread都在調(diào)用syzDemo對象中的syzDemo方法,因為syzDemo方法加了synchronized
在圖3中thread1和thread分別調(diào)用syzDemo和syzDemo1對象中的syzDemo1方法,但是因為syzDemo1方法屬于靜態(tài)方法,在類加載時就會加載到方法區(qū),所以本質(zhì)上兩個線程都在調(diào)用同一個方法,于是產(chǎn)生了互斥
syzDemo2中與syzDemo相同:鎖定的是當前實例的這一段代碼,只有多個線程中調(diào)用的是同一個實例且執(zhí)行到這一段代碼時才會互斥,syzDemo3于syzDemo1相同:鎖定的是當前類的這一段代碼,只要多個線程共同執(zhí)行這一段代碼就會產(chǎn)生互斥
到此這篇關(guān)于Java多線程之synchronized關(guān)鍵字的使用的文章就介紹到這了,更多相關(guān)Java synchronized關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中HashMap.values()轉(zhuǎn)為ArrayList()問題
這篇文章主要介紹了java中HashMap.values()轉(zhuǎn)為ArrayList()問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
WeakHashMap?和?HashMap?區(qū)別及使用場景
這篇文章主要為大家介紹了WeakHashMap?和?HashMap?的區(qū)別是什么以及何時使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
詳解springboot項目帶Tomcat和不帶Tomcat的兩種打包方式
這篇文章主要介紹了詳解springboot項目帶Tomcat和不帶Tomcat的兩種打包方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09
kotlin中const 和val的區(qū)別及使用場景分析
在 Kotlin 中,const 和 val 都是用來聲明常量的,但它們的使用場景和功能有所不同,下面給大家介紹kotlin中const 和val的區(qū)別,感興趣的朋友一起看看吧2025-04-04

