Java多線程之synchronized關(guān)鍵字的使用
一、使用在非靜態(tài)方法上
public synchronized void syzDemo(){ System.out.println(System.currentTimeMillis()); System.out.println("進(jìn)入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("進(jìn)入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("進(jìn)入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("進(jìn)入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方法,因?yàn)閮蓚€線程調(diào)用是不同的對象的兩個方法,所以不會互斥
在圖2中thread1和thread都在調(diào)用syzDemo對象中的syzDemo方法,因?yàn)閟yzDemo方法加了synchronized
在圖3中thread1和thread分別調(diào)用syzDemo和syzDemo1對象中的syzDemo1方法,但是因?yàn)閟yzDemo1方法屬于靜態(tài)方法,在類加載時就會加載到方法區(qū),所以本質(zhì)上兩個線程都在調(diào)用同一個方法,于是產(chǎn)生了互斥
syzDemo2中與syzDemo相同:鎖定的是當(dāng)前實(shí)例的這一段代碼,只有多個線程中調(diào)用的是同一個實(shí)例且執(zhí)行到這一段代碼時才會互斥,syzDemo3于syzDemo1相同:鎖定的是當(dāng)前類的這一段代碼,只要多個線程共同執(zhí)行這一段代碼就會產(chǎn)生互斥
到此這篇關(guān)于Java多線程之synchronized關(guān)鍵字的使用的文章就介紹到這了,更多相關(guān)Java synchronized關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring實(shí)戰(zhàn)之Bean銷毀之前的行為操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之Bean銷毀之前的行為操作,結(jié)合實(shí)例形式分析了spring在bean銷毀之前的行為相關(guān)設(shè)置與使用技巧,需要的朋友可以參考下2019-11-11Java異常繼承結(jié)構(gòu)解析_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java異常繼承結(jié)構(gòu)解析的相關(guān)知識,需要的朋友可以參考下2017-04-04JAVA中方法的聲明及使用方式(繼承、多態(tài)、封裝)
這篇文章主要介紹了JAVA中方法的聲明及使用方式(繼承、多態(tài)、封裝),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-02-02IDEA調(diào)試小技巧之Evaluate調(diào)試工具詳解
這篇文章主要介紹了IDEA調(diào)試小技巧之Evaluate調(diào)試工具,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09spring boot實(shí)現(xiàn)過濾器和攔截器demo
本篇文章主要介紹了spring boot實(shí)現(xiàn)過濾器和攔截器demo ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02解決Spring?Security升級到5.5.7、5.6.4及以上啟動報錯出現(xiàn)版本不兼容的問題
這篇文章主要介紹了解決Spring?Security升級到5.5.7、5.6.4及以上啟動報錯出現(xiàn)版本不兼容的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08Java object wait notify notifyAll代碼解析
這篇文章主要介紹了Java object wait notify notifyAll代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11