一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java 線程同步詳解

Java 線程同步詳解

2020-04-12 16:43趙杰A-124 JAVA教程

這篇文章主要給大家詳細介紹的是Java 線程同步的相關問題及代碼示例,有需要的小伙伴可以參考下

Java 線程同步根本上是要符合一個邏輯:加鎖------>修改------>釋放鎖

1、同步代碼塊

示例如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class SyncBlock {
  static class DataWrap {
    int i;
  }
  
  static class SyncBlockThread extends Thread {
    private DataWrap date;
    
    public SyncBlockThread(DataWrap dataWrap) {
      this.date = dataWrap;
    }
    
    @Override
    public void run() {
      
      for (int i = 0; i < 10; i++) {
        synchronized (date) {
          date.i++;
          try {
            sleep(1);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
          System.out.println(getName() + " " + date.i);
        }
      }
    }
  }
  
  public static void main(String[] args) {
    //多線程實現變量i依次加一輸出
    DataWrap dataWrap = new DataWrap();
    
    new SyncBlockThread(dataWrap).start();
    new SyncBlockThread(dataWrap).start();
    new SyncBlockThread(dataWrap).start();
  }
 
}

示例中希望按照順序依次輸出整數。

通常同步代碼塊是需要鎖定的對象,一般是需要并發訪問的共享資源,任何線程在修改指定資源之前都首先對該資源加鎖,在加鎖期間其它線程無法修改該資源。從而保證了線程的安全性。另外線程在調用sleep或者yield時并不會讓出資源鎖。

2、同步方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class SyncMethod {
  
  static class DataWrap{
    int i;
    
    public synchronized void valueGrow(){
      i++;
      
      try {
        Thread.sleep(1);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      System.out.println(Thread.currentThread().getName() + " " + i);
    }
  }
  
  static class SyncMethodThread extends Thread {
    DataWrap dataWrap;
    
    public SyncMethodThread(DataWrap dataWrap){
      this.dataWrap = dataWrap;
    }
    
    @Override
    public void run() {
      for (int i = 0; i < 10; i++) {
        dataWrap.valueGrow(); 
      }
    }
  }
  
  public static void main(String[] args) {
    //實現順序增長并輸出Datawrap中的i
    
    DataWrap dataWrap = new DataWrap();
    
    new SyncMethodThread(dataWrap).start();
    new SyncMethodThread(dataWrap).start();
    new SyncMethodThread(dataWrap).start();
  }
 
}

同步方法是使用synchronized關鍵字修飾的某個方法,同步方法鎖定的就是該對象本身,所以當一個線程調用了某個對象的同步方法后,如有其它線程調用該對象的其它同步方法,也依然要等待釋放該對象的鎖,因為該對象已被鎖定。

3、同步鎖

通過定義同步鎖對象實現同步,這種情況下,同步鎖使用Lock對象充當。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
public class SyncLock {
 
  static class DataWrap{
    Lock lock = new ReentrantLock();
    int i;
    
    public void valueGrow(){
      lock.lock();
      try {
        i++;
        
        try {
          Thread.sleep(1);
        } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " " + i); 
      } finally {
        lock.unlock();
      }
      
    }
  }
  
  static class SyncLockThread extends Thread {
    DataWrap dataWrap;
    
    public SyncLockThread(DataWrap dataWrap){
      this.dataWrap = dataWrap;
    }
    
    @Override
    public void run() {
      for (int i = 0; i < 10; i++) {
        dataWrap.valueGrow(); 
      }
    }
  }
  
  public static void main(String[] args) {
    //實現順序增長并輸出Datawrap中的i
    
    DataWrap dataWrap = new DataWrap();
        
    new SyncLockThread(dataWrap).start();
    new SyncLockThread(dataWrap).start();
    new SyncLockThread(dataWrap).start();
  }
 
}

使用鎖對象實現線程同步會更靈活一些,某些鎖還具有一些特定的功能,其中比較常用的ReadWriteLock讀寫鎖,ReentrantLock可重入鎖。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产在线观看福利 | 糖心vlog网页版 | 亚洲va欧美va天堂v国产综合 | 亚洲精品中文字幕久久久久久 | 欧美日韩一级视频 | 日韩天堂网| 亚洲麻豆精品 | 欧美三级一区 | 青青草原社区 | 日韩欧美一区二区三区四区 | 小辣椒精品福利视频导航 | 精品无人区麻豆乱码无限制 | 国产裸露片段精华合集链接 | 884aa在线看片 | 亚洲精品第一国产综合高清 | gay男男白袜chinese | 久久精品观看影院2828 | 日本一区二区三区久久精品 | 久久婷婷五月免费综合色啪 | 九九国产在线 | 涩色爱 | 网友偷自拍原创区 | 红色播放器 | 亚洲视频免| 香蕉久草 | 日韩欧美国产免费看清风阁 | 亚洲精品丝袜在线一区波多野结衣 | 大桥未久midd—962在线 | 极品在线 | 国产外围 | 波多野结衣中文字幕乱七八糟 | 国产精品国语自产拍在线观看 | 精品一区二区国语对白 | 被教官揉了一晚上的奶小说 | 亚洲国产一区二区a毛片 | 成人精品视频一区二区在线 | 五月色婷婷网在线观看 | 免费一级特黄特色大片在线观看 | 免费一区二区视频 | 亚洲青草 | 国产嘿咻 |