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

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 淺談多線程中的鎖的幾種用法總結(jié)(必看)

淺談多線程中的鎖的幾種用法總結(jié)(必看)

2020-10-22 17:31jingxian Java教程

下面小編就為大家?guī)?lái)一篇淺談多線程中的鎖的幾種用法總結(jié)(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

一、ReentrantLock

?
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
55
56
57
58
59
60
61
62
63
package com.ietree.basicskill.mutilthread.lock;
 
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
/**
 * Created by Administrator on 2017/5/17.
 */
public class UseReentrantLock {
 
  private Lock lock = new ReentrantLock();
 
  public void method1(){
    try {
      lock.lock();
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "進(jìn)入method1..");
      Thread.sleep(1000);
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "退出method1..");
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
 
      lock.unlock();
    }
  }
 
  public void method2(){
    try {
      lock.lock();
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "進(jìn)入method2..");
      Thread.sleep(2000);
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "退出method2..");
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
 
      lock.unlock();
    }
  }
 
  public static void main(String[] args) {
 
    final UseReentrantLock ur = new UseReentrantLock();
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        ur.method1();
        ur.method2();
      }
    }, "t1");
 
    t1.start();
    try {
      Thread.sleep(10);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    //System.out.println(ur.lock.getQueueLength());
  }
 
}

二、ReentrantReadWriteLock

?
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
package com.ietree.basicskill.mutilthread.lock;
 
import java.util.concurrent.locks.ReentrantReadWriteLock;
 
/**
 * Created by Administrator on 2017/5/17.
 */
public class UseReentrantReadWriteLock {
 
  private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
  private ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
  private ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();
 
  public void read(){
    try {
      readLock.lock();
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "進(jìn)入...");
      Thread.sleep(3000);
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "退出...");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      readLock.unlock();
    }
  }
 
  public void write(){
    try {
      writeLock.lock();
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "進(jìn)入...");
      Thread.sleep(3000);
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "退出...");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      writeLock.unlock();
    }
  }
 
  public static void main(String[] args) {
 
    final UseReentrantReadWriteLock urrw = new UseReentrantReadWriteLock();
 
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        urrw.read();
      }
    }, "t1");
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        urrw.read();
      }
    }, "t2");
    Thread t3 = new Thread(new Runnable() {
      @Override
      public void run() {
        urrw.write();
      }
    }, "t3");
    Thread t4 = new Thread(new Runnable() {
      @Override
      public void run() {
        urrw.write();
      }
    }, "t4");
 
//    t1.start();
//    t2.start();
 
//    t1.start(); // R
//    t3.start(); // W
 
    t3.start();
    t4.start();
  }
}

三、Condition

?
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
55
56
57
58
59
60
61
62
package com.ietree.basicskill.mutilthread.lock;
 
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
/**
 * Created by Administrator on 2017/5/17.
 */
public class UseCondition {
  private Lock lock = new ReentrantLock();
  private Condition condition = lock.newCondition();
 
  public void method1(){
    try {
      lock.lock();
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "進(jìn)入等待狀態(tài)..");
      Thread.sleep(3000);
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "釋放..");
      condition.await();  // Object wait
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() +"繼續(xù)執(zhí)行...");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public void method2(){
    try {
      lock.lock();
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "進(jìn)入..");
      Thread.sleep(3000);
      System.out.println("當(dāng)前線程:" + Thread.currentThread().getName() + "發(fā)出喚醒..");
      condition.signal();    //Object notify
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public static void main(String[] args) {
 
    final UseCondition uc = new UseCondition();
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        uc.method1();
      }
    }, "t1");
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        uc.method2();
      }
    }, "t2");
    t1.start();
 
    t2.start();
  }
}

四、ManyCondition

?
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package com.ietree.basicskill.mutilthread.lock;
 
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
 
/**
 * Created by Administrator on 2017/5/17.
 */
public class UseManyCondition {
  private ReentrantLock lock = new ReentrantLock();
  private Condition c1 = lock.newCondition();
  private Condition c2 = lock.newCondition();
 
  public void m1(){
    try {
      lock.lock();
      System.out.println("當(dāng)前線程:" +Thread.currentThread().getName() + "進(jìn)入方法m1等待..");
      c1.await();
      System.out.println("當(dāng)前線程:" +Thread.currentThread().getName() + "方法m1繼續(xù)..");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public void m2(){
    try {
      lock.lock();
      System.out.println("當(dāng)前線程:" +Thread.currentThread().getName() + "進(jìn)入方法m2等待..");
      c1.await();
      System.out.println("當(dāng)前線程:" +Thread.currentThread().getName() + "方法m2繼續(xù)..");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public void m3(){
    try {
      lock.lock();
      System.out.println("當(dāng)前線程:" +Thread.currentThread().getName() + "進(jìn)入方法m3等待..");
      c2.await();
      System.out.println("當(dāng)前線程:" +Thread.currentThread().getName() + "方法m3繼續(xù)..");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public void m4(){
    try {
      lock.lock();
      System.out.println("當(dāng)前線程:" +Thread.currentThread().getName() + "喚醒..");
      c1.signalAll();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public void m5(){
    try {
      lock.lock();
      System.out.println("當(dāng)前線程:" +Thread.currentThread().getName() + "喚醒..");
      c2.signal();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public static void main(String[] args) {
 
 
    final UseManyCondition umc = new UseManyCondition();
    Thread t1 = new Thread(new Runnable() {
      @Override
      public void run() {
        umc.m1();
      }
    },"t1");
    Thread t2 = new Thread(new Runnable() {
      @Override
      public void run() {
        umc.m2();
      }
    },"t2");
    Thread t3 = new Thread(new Runnable() {
      @Override
      public void run() {
        umc.m3();
      }
    },"t3");
    Thread t4 = new Thread(new Runnable() {
      @Override
      public void run() {
        umc.m4();
      }
    },"t4");
    Thread t5 = new Thread(new Runnable() {
      @Override
      public void run() {
        umc.m5();
      }
    },"t5");
 
    t1.start();  // c1
    t2.start();  // c1
    t3.start();  // c2
 
 
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
 
    t4.start();  // c1
    try {
      Thread.sleep(2000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    t5.start();  // c2
 
  }
}

以上這篇淺談多線程中的鎖的幾種用法總結(jié)(必看)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 性色香蕉AV久久久天天网 | bnb998八度免费影院丫意浓 | 3d动漫美女被吸乳羞羞有 | 91国内精品久久久久影院优播 | 高中生放荡日记高h娜娜 | 校草太大了h | 全肉一女n男np高h双龙养成 | 91麻豆国产福利在线观看 | 欧美日韩亚洲综合久久久 | www.av在线免费观看 | 男男浴室吸乳play | 欧美在线观看视频一区 | 精品国产一级在线观看 | 99爱在线精品视频免费观看9 | 国产精品俺来也在线观看了 | 国产亚洲精品激情一区二区三区 | 青春草在线观看精品免费视频 | 日韩视频在线免费观看 | 亚洲日本视频在线 | 无限资源在线观看8 | 被强上后我成瘾了小说 | 美女张开双腿让男人捅 | 国产一卡二卡3卡4卡四卡在线视频 | 美女把腿开让我 | 2020国产精品亚洲综合网 | 日韩国产欧美成人一区二区影院 | 日本一区二区三区四区无限 | 天天摸天天碰色综合网 | 国产一级毛片潘金莲的奶头 | 2022最新国产在线 | 精品国产在天天线在线麻豆 | 国产高清在线精品一区二区三区 | 四虎精品免费国产成人 | 色婷婷在线播放 | 欧美乱强 | 国产午夜免费 | 日本在线色 | 女仆色永久免费网站 | 美女污视频在线观看 | bl放荡受np双性 | 色国产精品 |