日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Java中關(guān)鍵字synchronized的使用方法詳解

瀏覽:178日期:2023-02-11 11:48:26

synchronized是Java里的一個關(guān)鍵字,起到的一個效果是“監(jiān)視器鎖”~~,它的功能就是保證操作的原子性,同時禁止指令重排序和保證內(nèi)存的可見性!

public class TestDemo { static class Counter{public int count = 0;public void add(){ count++;} } public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();Thread t1 = new Thread(){ @Override public void run() {for (int i = 0; i < 50000; i++) { counter.add();} }};Thread t2 = new Thread(){ @Override public void run() {for (int i = 0; i < 50000; i++) { counter.add();} }};//啟動兩個線程t1.start();t2.start();//等待兩個線程結(jié)束t1.join();t2.join();System.out.println(counter.count); }}

Java中關(guān)鍵字synchronized的使用方法詳解

此時的線程就是不安全的,如何解決呢?

給我們的Counter對象里的add方法加上synchronized關(guān)鍵字,針對這個方法進行了加鎖操作。進入代碼塊(調(diào)用方法)自動加鎖,出了代碼塊(方法結(jié)束),自動解鎖。

public class TestDemo { static class Counter{public int count = 0; //修飾方法 synchronized public void add{ count++;} } public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();Thread t1 = new Thread(){ @Override public void run() {for (int i = 0; i < 50000; i++) { counter.add();} }};Thread t2 = new Thread(){ @Override public void run() {for (int i = 0; i < 50000; i++) { counter.add();} }};//啟動兩個線程t1.start();t2.start();//等待兩個線程結(jié)束t1.join();t2.join();System.out.println(counter.count); }}

Java中關(guān)鍵字synchronized的使用方法詳解

那么這里的代碼是如何保證正確的呢?

使用synchronized 就相當(dāng)于在我們執(zhí)行的指令里又加入了2條新指令。

LOCK (加鎖)

UNLOCK (解鎖)

LOCK操作特性:只有一個線程能執(zhí)行成功!如果第一個線程執(zhí)行成功,第二個線程也嘗試LOCK,就會阻塞等待,直到第一個線程執(zhí)行UNLOCK 釋放鎖~

Java中關(guān)鍵字synchronized的使用方法詳解

通過LOCK和UNLOCK 就把 LOAD ADD SAVE 這三個指令,給打包成了一個原子的操作(中間不能被打斷,也不能被其他線程穿插)。

這里的加鎖也是保證原子性的核心操作,所以線程里的沒組指令就會順序執(zhí)行,不在穿插執(zhí)行,就保證了線程1執(zhí)行完之后再去執(zhí)行線程2。

舉個例子:

就好比張三和李四去ATM里去取錢,當(dāng)張三進去取錢時,進去后就會鎖門,李四就會在外面等待,直到張三取完錢出來后,李四在進去取錢。

synchronized 也會禁止編譯器進行“內(nèi)存可見性”和“指令重排序”的優(yōu)化~ 同時程序運行的效率就會降低,也會導(dǎo)致線程之間相互去等待,就涉及到系統(tǒng)的一些調(diào)度,也會引入一些時間成本。

synchronized修飾的對象有以下幾種:

修飾一個代碼塊,被修飾的代碼塊稱為同步語句塊,其作用的范圍是大括號{}括起來的代碼,作用的對象是調(diào)用這個代碼塊的對象;

public class TestDemo{ public void methond() {// 進入代碼塊會鎖 this 指向?qū)ο笾械逆i;// 出代碼塊會釋放 this 指向的對象中的鎖synchronized (this) {} } public static void main(String[] args) {TestDemo demo = new TestDemo();demo.methond(); }}

修飾一個方法,被修飾的方法稱為同步方法,其作用的范圍是整個方法,作用的對象是調(diào)用這個方法的對象;

public class TestDemo{ public synchronized void methond() { } public static void main(String[] args) {TestDemo demo = new TestDemo();demo.methond();// 進入方法會鎖 demo 指向?qū)ο笾械逆i;// 出方法會釋放 demo 指向的對象中的鎖 }}

修改一個靜態(tài)的方法,其作用的范圍是整個靜態(tài)方法,作用的對象是這個類的所有對象;

public class TestDemo{ public synchronized static void methond() { } public static void main(String[] args) {methond();// 進入方法會鎖 TestDemo.class 指向?qū)ο笾械逆i;//出方法會釋放 TestDemo.class 指向的對象中的鎖 }}

修改一個類,其作用的范圍是synchronized后面括號括起來的部分,作用主的對象是這個類的所有對象。

public class TestDemo{ public static void methond() {// 進入代碼塊會鎖 TestDemo.class 指向?qū)ο笾械逆i;//出代碼塊會釋放 TestDemo.class 指向的對象中的鎖synchronized (TestDemo.class) {} } public static void main(String[] args) {TestDemo demo = new TestDemo();demo.methond(); }}

總結(jié):

無論synchronized關(guān)鍵字加在方法上還是對象上,如果它作用的對象是非靜態(tài)的,則它取得的鎖是對象; 如果synchronized作用的對象是一個靜態(tài)方法或一個類,則它取得的鎖是對類,該類所有的對象同一把鎖。 每個對象只有一個鎖(lock)與之相關(guān)聯(lián),誰拿到這個鎖誰就可以運行它所控制的那段代碼。 實現(xiàn)同步是要很大的系統(tǒng)開銷作為代價的,甚至可能造成死鎖,所以盡量避免無謂的同步控制。

拓展:

public class TestDemo { static class Counter{public int count = 0; public void add(){ synchronized (this){ count++; }} } public static void main(String[] args) throws InterruptedException {Counter counter = new Counter();Thread t1 = new Thread(){ @Override public void run() {for (int i = 0; i < 50000; i++) { synchronized (counter){counter.add(); }} }};Thread t2 = new Thread(){ @Override public void run() {for (int i = 0; i < 50000; i++) { synchronized (counter){counter.add(); }} }};//啟動兩個線程t1.start();t2.start();//等待兩個線程結(jié)束t1.join();t2.join();System.out.println(counter.count); }}

此時可以看出上述代碼,加了兩次鎖,會發(fā)生什么呢?

Java中關(guān)鍵字synchronized的使用方法詳解

Java中關(guān)鍵字synchronized的使用方法詳解

但是運行代碼發(fā)現(xiàn)程序依然正確運行?? 為什么

但是上述分析死鎖的思路是對的

只是因為synchronized內(nèi)部使用特殊手段來處理了這種情況 。

這樣的操作特性我們叫做 可重入鎖

synchronized 內(nèi)部記錄了當(dāng)前這把鎖是哪個線程持有的~

如果當(dāng)前加鎖線程和持有鎖的線程是同一個線程~

此時就并不是真的進行“加鎖操作”,而是把一個計數(shù)器加一;

如果后續(xù)該線程繼續(xù)嘗試獲取鎖,繼續(xù)判定加鎖線程和持有鎖線程是不是同一個線程,只要是同一個線程,就不真的加鎖,而是計數(shù)器+1;

如果該線程調(diào)用解鎖操作,也不是立刻就解鎖,而是計數(shù)器減1

直到計數(shù)器減成0了,才認為真的要“釋放鎖”,才允許其他線程來獲取鎖~~

總結(jié)

到此這篇關(guān)于Java中synchronized使用的文章就介紹到這了,更多相關(guān)Java中synchronized用法內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲精品日本| 国产高潮在线| 91精品蜜臀一区二区三区在线 | 老司机精品视频网| 一区二区精品| 亚洲区第一页| 欧美一级二级视频| 老司机精品在线| 成人高清一区| 最新国产拍偷乱拍精品| 亚洲一区中文| 热久久久久久| 黑人精品一区| 噜噜噜躁狠狠躁狠狠精品视频 | 麻豆国产精品777777在线| 精品视频亚洲| 久久精品免费一区二区三区| 婷婷丁香综合| 911精品国产| 久久青青视频| 热久久免费视频| 欧美激情aⅴ一区二区三区 | 先锋亚洲精品| 精品日本视频| 噜噜噜久久亚洲精品国产品小说| 中文亚洲欧美| 国产欧美成人| 国产一区亚洲| 国产精品一区免费在线| 日韩久久视频| 欧美日韩18| 欧洲激情综合| 国产精品视频一区二区三区综合 | 国产综合精品一区| 亚洲精品系列| 日韩免费福利视频| 亚洲精品成a人ⅴ香蕉片| 国产精品99一区二区三| 亚洲精品无吗| 黑森林国产精品av| 日本午夜免费一区二区| 欧美日韩国产传媒| 精品国产黄a∨片高清在线| 亚洲尤物在线| 国产麻豆久久| 国产精品亚洲综合久久| 国产精品女主播一区二区三区| 国产欧美一区二区三区精品观看 | 国产精品日本一区二区三区在线| 热三久草你在线| 亚洲色图网站| 国产日韩高清一区二区三区在线 | 91tv亚洲精品香蕉国产一区| 国产精品xx| 国产伦精品一区二区三区视频 | 日韩av午夜在线观看| 99在线精品免费视频九九视| 理论片午夜视频在线观看| 综合激情婷婷| 国产精品97| 欧美+亚洲+精品+三区| 成人高清一区| 日韩综合一区| 久久蜜桃av| 久久av电影| 欧美一区成人| 欧美一区精品| 欧美日本三区| 麻豆国产精品一区二区三区| 国产欧美丝祙| 狠狠操综合网| 久久免费高清| 国产自产自拍视频在线观看| 欧美亚洲tv| 国产精品免费99久久久| 国产乱子精品一区二区在线观看| 欧美亚洲福利| 精品久久精品| 色婷婷精品视频| 群体交乱之放荡娇妻一区二区| 国产精品伦理久久久久久| av中文资源在线资源免费观看| 波多视频一区| 一区二区亚洲精品| 免费人成精品欧美精品| 日本在线不卡视频一二三区| 国产精品一区亚洲| 成人啊v在线| 欧美日韩国产v| 日韩国产综合| 亚洲一区二区成人| 欧美1级日本1级| 麻豆精品少妇| 国产精品视频一区二区三区| 中文字幕av一区二区三区人| 视频一区二区三区入口| 97欧美在线视频| 国产毛片精品| 日本不卡一二三区黄网| 日韩一区二区三区精品视频第3页| 精品资源在线| 午夜在线播放视频欧美| 国产精品一级| 国产精品亚洲欧美| 日本亚洲欧洲无免费码在线| 亚洲精品欧洲| 欧美gv在线| 国产精品一区二区三区美女| 免费在线观看一区二区三区| 国产欧美日韩一级| 国产伊人精品| 久久国产电影| 国产一区二区三区探花| 亚洲开心激情| 免费欧美一区| 伊人影院久久| 久久国产视频网| 久久青青视频| 日韩精品五月天| 日韩国产一区二区三区| 群体交乱之放荡娇妻一区二区| 久久中文字幕av| 高清在线一区| 在线成人直播| 欧美中文字幕一区二区| 日本va欧美va欧美va精品| 欧美精品福利| 欧美精品一二| 亚洲精品免费观看| 日韩精品免费一区二区在线观看| 亚洲欧美网站| 99视频一区| 国产婷婷精品| 久久国产精品久久久久久电车| 亚洲在线电影| 黄色欧美日韩| 精品一区亚洲| 国产精品99一区二区三区| 久久av免费| 精品一区视频| 日韩av一区二区三区四区| 国产一区二区三区网| 国产日韩1区| 日韩精品91亚洲二区在线观看| 亚洲精品大片| 日本不卡视频在线| 国产高清日韩| 欧美日本三区| 国产精品1luya在线播放| 婷婷综合亚洲| 麻豆9191精品国产| 欧美一区二区三区免费看| 久久国产生活片100| 成人在线超碰| 亚洲午夜视频| 欧美视频一区| 一区二区三区四区在线观看国产日韩 | 日本欧美在线看| 日本中文字幕一区二区| 国产精品天天看天天狠| 亚洲国产一区二区在线观看| 蜜臀久久99精品久久久画质超高清| 一区二区国产在线观看| 日本综合精品一区| 欧美xxxx中国| 999久久久免费精品国产| 日韩午夜av在线| 久久国产精品久久w女人spa| 91精品福利观看| 亚洲伦乱视频| 午夜久久av | 欧美精品一二| 香蕉久久一区| 午夜性色一区二区三区免费视频| 色婷婷综合网| 亚洲精品国产精品粉嫩| 国产一区二区三区不卡视频网站| 日韩中文影院| 亚洲欧美在线综合| 欧美aaaaaa午夜精品| 亚洲精品一级二级| 亚洲精品人人| 国产精品啊v在线| 91视频精品| 久久av综合| 日韩欧美精品| 国产精品一区二区美女视频免费看| 久久精品三级| 91av一区| 久久午夜视频| 久久精品成人| 久久精品国内一区二区三区| 视频一区中文字幕国产| 日韩理论片av| 婷婷综合六月| 成人在线黄色| 美女精品久久| 国产欧美日韩影院| 午夜视频一区二区在线观看| 免费视频国产一区|