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

您的位置:首頁技術文章
文章詳情頁

Java中關鍵字synchronized的使用方法詳解

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

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

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();//等待兩個線程結束t1.join();t2.join();System.out.println(counter.count); }}

Java中關鍵字synchronized的使用方法詳解

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

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

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();//等待兩個線程結束t1.join();t2.join();System.out.println(counter.count); }}

Java中關鍵字synchronized的使用方法詳解

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

使用synchronized 就相當于在我們執行的指令里又加入了2條新指令。

LOCK (加鎖)

UNLOCK (解鎖)

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

Java中關鍵字synchronized的使用方法詳解

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

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

舉個例子:

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

synchronized 也會禁止編譯器進行“內存可見性”和“指令重排序”的優化~ 同時程序運行的效率就會降低,也會導致線程之間相互去等待,就涉及到系統的一些調度,也會引入一些時間成本。

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

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

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

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

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

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

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

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

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

總結:

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

拓展:

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();//等待兩個線程結束t1.join();t2.join();System.out.println(counter.count); }}

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

Java中關鍵字synchronized的使用方法詳解

Java中關鍵字synchronized的使用方法詳解

但是運行代碼發現程序依然正確運行?? 為什么

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

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

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

synchronized 內部記錄了當前這把鎖是哪個線程持有的~

如果當前加鎖線程和持有鎖的線程是同一個線程~

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

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

如果該線程調用解鎖操作,也不是立刻就解鎖,而是計數器減1

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

總結

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

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产免费播放一区二区| 在线日韩欧美| 日韩国产综合| 免费一区二区三区在线视频| 国产美女撒尿一区二区| 成人午夜国产| 精品三级久久| 久久av一区二区三区| 亚洲五月综合| 欧美日本二区| 九九色在线视频| 久久av一区| 青青伊人久久| 国产精品久久久久av电视剧| 性欧美xxxx免费岛国不卡电影| 91久久亚洲| 视频精品一区二区| 国产伦理一区| 亚洲1234区| 美女日韩在线中文字幕| 99热精品久久| 亚洲激情国产| 欧美国产中文高清| 九九久久电影| 亚洲一区二区三区高清不卡| 日韩精品dvd| 亚洲另类黄色| 视频一区欧美日韩| 久久99视频| 精品视频一区二区三区在线观看| 日韩欧乱色一区二区三区在线| 清纯唯美亚洲综合一区| 亚洲一本视频| 国产精品久久久久久久免费观看 | 精品网站999| 亚洲精品小说| 国产午夜精品一区二区三区欧美 | 韩国三级一区| 亚洲久久视频| 视频一区日韩| 亚洲欧洲日韩| 亚洲午夜天堂| а√天堂8资源中文在线| 国产毛片一区| 国产成人精选| 日本不卡视频在线| 国产成人精品一区二区三区视频| 欧美日韩国产高清| 群体交乱之放荡娇妻一区二区| 日韩国产在线观看一区| 夜夜精品视频| 丝袜美腿成人在线| 天堂中文av在线资源库| 久久久久久色 | 国产在线观看91一区二区三区| 亚洲91网站| 亚洲精品免费观看| 久久久久国产精品一区二区| 久久久久久久久久久妇女| 狠狠爱www人成狠狠爱综合网| 伊人久久大香线蕉av不卡| 国内精品99| 激情黄产视频在线免费观看| 丁香六月综合| 少妇精品在线| av亚洲免费| 亚洲精品123区| 吉吉日韩欧美| 激情综合亚洲| 亚洲制服欧美另类| re久久精品视频| 西西人体一区二区| 欧美女激情福利| 亚洲天堂日韩在线| 伊人久久大香线蕉av超碰演员| 中文在线а√天堂| 黄色国产精品| 丝袜美腿亚洲一区二区图片| 亚洲网站视频| 日韩中出av| 视频在线在亚洲| 亚洲一区二区三区四区电影| 青青伊人久久| 亚洲精品护士| 久久亚洲道色| 香蕉久久国产| 亚洲作爱视频| 美女久久精品| 国产欧美一区二区三区米奇| 国产欧美日韩在线观看视频| 精品国产乱码久久久久久樱花| 国产日产精品_国产精品毛片 | 99精品视频在线| 国产精品美女久久久浪潮软件| 日韩**一区毛片| 日本蜜桃在线观看视频| 久久亚洲风情| 欧美黄页在线免费观看| 中文字幕日韩高清在线| 欧美国产极品| 亚洲欧洲一区| 亚洲精品综合| 免费在线小视频| 久久国产成人午夜av影院宅| 综合激情在线| 日韩福利视频一区| 国产成人精品一区二区免费看京| 一区福利视频| 日韩国产精品久久久久久亚洲| 精品在线网站观看| 亚洲天堂久久| 在线综合亚洲| 国产一区丝袜| 日韩影院二区| 日韩激情视频网站| 日本国产一区| 黄色成人在线网址| 久久97视频| 女主播福利一区| 成人国产精品一区二区网站| 亚洲啊v在线| 国产精品久久久久久妇女| 欧美精品aa| 亚久久调教视频| 最新日韩欧美| 91日韩免费| 国产精品大片| 天海翼亚洲一区二区三区| 国产精品自在| 亚洲三级网址| 九九在线精品| 91tv亚洲精品香蕉国产一区| 国产极品模特精品一二 | 久久人人精品| 精品99久久| 亚洲精品午夜av福利久久蜜桃| 久久精品人人| 奇米亚洲欧美| 深夜福利亚洲| 视频一区二区三区在线| 国产精品久久久久77777丨| 亚洲欧美日韩视频二区| 欧美日一区二区三区在线观看国产免 | 精品资源在线| 伊人精品一区| 中文字幕一区久| 国产精品一页| 免费视频一区三区| 亚洲一级少妇| 欧美日韩在线二区| 麻豆精品蜜桃| www.51av欧美视频| 成人亚洲一区| 国产精品99视频| 国产精品啊v在线| 亚洲一区二区成人| 亚洲精品成人| 尹人成人综合网| 久久av资源| 日韩成人午夜精品| 日本高清不卡一区二区三区视频| 国产精品大片| 在线亚洲自拍| 久久成人国产| 亚洲综合精品| 精品久久精品| 色爱综合网欧美| 亚洲天堂免费| 亚洲图片久久| 亚洲午夜黄色| 国产精品91一区二区三区| 美女视频网站久久| 日韩中文字幕亚洲一区二区va在线 | 欧美日韩激情在线一区二区三区| 日韩国产欧美在线播放| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲啊v在线| 桃色av一区二区| 91精品国产91久久久久久黑人| 欧美二区视频| 亚洲免费中文| 神马午夜久久| 亚洲欧美日韩国产| 亚洲伦乱视频| 国产在线日韩精品| 精品三级久久久| 欧美日韩一视频区二区| 欧美黄色精品| 国产欧美大片| 伊伊综合在线| 精品国产亚洲日本| 91看片一区| 免费高清在线一区| 欧美日韩视频免费看| 欧美激情视频一区二区三区免费| 亚洲精品国产精品粉嫩| 久久影视三级福利片| 国产日韩一区二区三区在线播放| 欧美国产不卡| 香蕉精品999视频一区二区|