国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

淺析Java 并發編程中的synchronized

瀏覽:2日期:2022-08-20 09:14:41

synchronized關鍵字,我們一般稱之為“同步鎖”,用它來修飾需要同步的方法和需要同步代碼塊,默認是當前對象作為鎖的對象。在用synchronized修飾類時(或者修飾靜態方法),默認是當前類的Class對象作為鎖的對象,故存在著方法鎖、對象鎖、類鎖這樣的概念。

一、沒有設置線程同步的情況

先給出以下代碼感受下代碼執行的時候為什么需要同步?代碼可能比較枯燥,配上業務理解起來就會舒服很多,學生軍訓,有三列,每列5人,需要報數,每個線程負責每一列報數。

class SynchronizedExample {protected static int num = 0;protected void numberOff() {for(int i=0; i<5; i++) {num++;System.out.println(Thread.currentThread().getName()+':'+SynchronizedExample.num);}}}public class SynchronizedTest {public static void main(String[] args) throws InterruptedException {SynchronizedExample se = new SynchronizedExample();for(int i=1; i<=3; i++) {new Thread( ()-> {se.numberOff();}, '線程'+i).start();}}}

執行結果如下:

線程1:1線程2:2線程1:3線程3:4.......

之所以出現這種情況,是因為三個線程是異步的,沒有同步。對應的業務場景就是,在第一列沒有完成報數的時候,其他隊列搶報了,這在現實中是不允許的,所以需要類似于synchronized等具有同步功能的關鍵字粉末登場。

二、方法同步鎖

當報數方法加上synchronized關鍵字之后,就會一列一列的報數。

protected synchronized void numberOff() {for(int i=0; i<5; i++) {num++;System.out.println(Thread.currentThread().getName()+':'+SynchronizedExample.num);}}

執行結果如下:

線程1:1線程1:2線程1:3線程1:4......

寫到這里還是要從技術層面講下原理,當一個線程執行帶有synchronized關鍵字的方法時,該線程會在該方法處設置一個鎖(其他線程打不開這個鎖,只能在外邊等該線程釋放掉該鎖,一般都是執行完所有代碼后主動釋放鎖),表示此方法是當前線程獨占的,對應到上述業務中就是一次只能有一個隊列報數。

三、對象鎖

改進后的代碼用到了一個對象鎖,該對象鎖默認是當前對象,上述代碼等同于以下代碼:

protected void numberOff() {synchronized (this) {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}

當多個線程用一個對象鎖,各個線程可以達到同步的作用,如果每個線程都用自己的對象鎖,那么synchronized就失去了同步的作用。如以下代碼:

class SynchronizedExample {protected static int num = 0;protected void numberOff() {synchronized (this) {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}}public class SynchronizedTest {public static void main(String[] args) throws InterruptedException {SynchronizedExample se = new SynchronizedExample();for(int i=1; i<=3; i++) {new Thread( ()-> {new SynchronizedExample().numberOff();}, '隊列'+i).start();}}}

執行結果如下:

線程1:1線程2:2線程1:3線程3:4.......

有讀者會說不同線程執行的是不同對象中的方法,肯定達不到同步的效果,也對,也很有道理,接著看如下代碼:

class SynchronizedExample {protected static int num = 0;protected void numberOff(Object lock) {synchronized (lock) {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}}public class SynchronizedTest {public static void main(String[] args) throws InterruptedException {SynchronizedExample se = new SynchronizedExample();for(int i=1; i<=3; i++) {new Thread( ()-> {se.numberOff(new Object());}, '隊列'+i).start();}}}

執行結果如下:

線程1:1線程2:2線程1:3線程3:4.......

四、類鎖

對于上述問題,讀者應該得出一個結論,要想達到同步的效果,必須用同一個鎖,此時類鎖可以粉末登場。看如下代碼:

protected void numberOff(Object lock) {synchronized (SynchronizedExample.class) {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}

上述代碼可以達到同步的效果。

五、靜態鎖

靜態鎖是針對靜態方法而言,當一個靜態方法中有synchronized關鍵字時,默認的是使用當前類字節碼對象作為鎖。代碼示例如下:

class SynchronizedExample {protected static int num = 0;protected synchronized static void numberOff() {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}public class SynchronizedTest {public static void main(String[] args) throws InterruptedException {for (int i = 1; i <= 3; i++) {new Thread(() -> { new SynchronizedExample().numberOff(); }, '隊列' + i).start();}}}

六、線程池實現

最后用線程池將上述代碼寫一下

package ioo;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;class SynchronizedExample {protected static int num = 0;protected synchronized static void numberOff() {for (int i = 0; i < 5; i++) {num++;System.out.println(Thread.currentThread().getName() + ':' + SynchronizedExample.num);}}}public class SynchronizedTest {public static void main(String[] args) throws InterruptedException {ExecutorService executorService = Executors.newCachedThreadPool();for(int i=1; i<=3; i++) {executorService.execute(() -> new SynchronizedExample().numberOff());}}}

以上就是淺析Java 并發編程中的synchronized的詳細內容,更多關于Java 并發編程 synchronized的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: www.日本高清 | 一本色道久久88亚洲精品综合 | 99久久免费精品国产免费 | 午夜香港三级a三级三点 | 香港经典a毛片免费观看爽爽影院 | 亚洲日本va午夜中文字幕 | 成人福利在线 | 在线精品国产成人综合第一页 | 亚洲成a人一区二区三区 | 久久久久久久综合色一本 | 免费在线观看一级毛片 | 国产成人91精品 | 欧美国产精品不卡在线观看 | 狠狠色狠狠色狠狠五月ady | 日韩国产精品99久久久久久 | 免费久| 国产精品自在自线亚洲 | 美女网站在线观看视频18 | 毛片成人| 91成人免费在线视频 | 国产成人高清一区二区私人 | 国产资源精品一区二区免费 | 国产精品男人的天堂 | 日韩美女啪啪 | 亚洲天堂精品在线观看 | 成人精品一区二区久久久 | 色拍拍噜噜噜aⅴ在线观看 色青青草原桃花久久综合 色婷婷91 | 亚洲国产欧美视频 | 1级a的观看视频 | 欧洲国产伦久久久久久久 | 在线黄| 久久国产成人亚洲精品影院老金 | 欧美亚洲国产精品久久 | 欧美日韩一区二区三区视频 | 99久久精品自在自看国产 | 日本久久一区二区 | 91精品一区二区综合在线 | 5级做人爱c视版免费视频 | 国产成人综合自拍 | 在线视频日韩 | 国产在线步兵一区二区三区 |