国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

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

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

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

下面小編就為大家帶來一篇淺談多線程中的鎖的幾種用法總結(必看)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、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("當前線程:" + Thread.currentThread().getName() + "進入method1..");
      Thread.sleep(1000);
      System.out.println("當前線程:" + Thread.currentThread().getName() + "退出method1..");
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    } finally {
 
      lock.unlock();
    }
  }
 
  public void method2(){
    try {
      lock.lock();
      System.out.println("當前線程:" + Thread.currentThread().getName() + "進入method2..");
      Thread.sleep(2000);
      System.out.println("當前線程:" + 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("當前線程:" + Thread.currentThread().getName() + "進入...");
      Thread.sleep(3000);
      System.out.println("當前線程:" + Thread.currentThread().getName() + "退出...");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      readLock.unlock();
    }
  }
 
  public void write(){
    try {
      writeLock.lock();
      System.out.println("當前線程:" + Thread.currentThread().getName() + "進入...");
      Thread.sleep(3000);
      System.out.println("當前線程:" + 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("當前線程:" + Thread.currentThread().getName() + "進入等待狀態..");
      Thread.sleep(3000);
      System.out.println("當前線程:" + Thread.currentThread().getName() + "釋放..");
      condition.await();  // Object wait
      System.out.println("當前線程:" + Thread.currentThread().getName() +"繼續執行...");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public void method2(){
    try {
      lock.lock();
      System.out.println("當前線程:" + Thread.currentThread().getName() + "進入..");
      Thread.sleep(3000);
      System.out.println("當前線程:" + Thread.currentThread().getName() + "發出喚醒..");
      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("當前線程:" +Thread.currentThread().getName() + "進入方法m1等待..");
      c1.await();
      System.out.println("當前線程:" +Thread.currentThread().getName() + "方法m1繼續..");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public void m2(){
    try {
      lock.lock();
      System.out.println("當前線程:" +Thread.currentThread().getName() + "進入方法m2等待..");
      c1.await();
      System.out.println("當前線程:" +Thread.currentThread().getName() + "方法m2繼續..");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public void m3(){
    try {
      lock.lock();
      System.out.println("當前線程:" +Thread.currentThread().getName() + "進入方法m3等待..");
      c2.await();
      System.out.println("當前線程:" +Thread.currentThread().getName() + "方法m3繼續..");
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public void m4(){
    try {
      lock.lock();
      System.out.println("當前線程:" +Thread.currentThread().getName() + "喚醒..");
      c1.signalAll();
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      lock.unlock();
    }
  }
 
  public void m5(){
    try {
      lock.lock();
      System.out.println("當前線程:" +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
 
  }
}

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: chinese国产一区二区 | 国产va| 色视频在线免费看 | 久久综合久色欧美综合狠狠 | 国产91精品久久久久 | 日本一区二区不卡在线观看 | 淫片免费观看 | 丝袜美腿一区二区三区 | 人人爱夜夜爽日日视频 | 日韩精品一级毛片 | av免费在线观看网站 | 91精品国产高清久久久久久久久 | 成人情趣视频 | 中文字幕免费播放 | 久久99精品久久久久久 | 一级毛片免费完整视频 | 欧美色图亚洲 | 久久色av | 亚洲精品视频播放 | 成人性毛片| 免费成人看片 | 久久中文字幕在线观看 | 欧美一区三区 | 色偷偷噜噜噜亚洲男人的天堂 | 精品国产成人 | 九九只有精品 | 国产黄色91视频 | 黄色一级大片在线免费看产 | 日韩欧美在线一区二区 | 久久国产亚洲 | 羞羞视频网 | 激情综合丁香 | www.99久| 精品伦精品一区二区三区视频 | 簧片av | 欧美视频免费看 | 91av在| 亚洲一区二区三区在线 | 日韩免费看 | 午夜小电影 | 看黄色片网站 |