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

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

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

服務器之家 - 編程語言 - Java教程 - 使用synchronized實現一個Lock代碼詳解

使用synchronized實現一個Lock代碼詳解

2021-03-07 12:39三 豐 Java教程

這篇文章主要介紹了使用synchronized實現一個Lock代碼詳解,具有一定借鑒價值,需要的朋友可以參考下。

剛看到這個題目的時候無從下手,因為覺得synchronized和lock在加鎖的方式上有很大不同,比如,看看正常情況下synchronized時如何加鎖的。

方式一:

?
1
2
3
public synchronized void a(){
  //TODO
}

方式二:

?
1
2
3
4
5
public void b(){
  synchronized(this){
    //TODO
  }
}

從這兩種方式來看,鎖都是加在{}之間的,我們再來看看Lock是如何做的呢:

?
1
2
3
4
5
6
7
8
public void c() {
  lock.lock();
  try {
    // TODO
  } finally {
    lock.unlock();
  }
}

這種方式的鎖是加在lock()和unlock()之間的,所以要想實現一個lock功能,就要想怎么實現這樣兩個方法,lock()和unlock()方法,先定義一個框架如下所示:

?
1
2
3
4
public void lock(){
}
public void unlock(){
}

然后要想怎么用synchronized去實現這兩個方法。

現在其實只是稍微清楚了一點思路,但是還不知道怎么去填充這兩個方法,這是后再來分析一下Lock的加鎖有什么特點,再來看看這段代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
public void c() {
    lock.lock();
    //When current thread get the lock, other thread has to wait
    try {
        //current thread get in the lock, other thread can not get in
        // TODO
    }
    finally {
        lock.unlock();
        //current thread release the lock
    }
}

這段代碼我只是加了一點注釋,別的什么都沒有做,是不是幫助理解這段代碼,看看出現頻率最高的詞是什么,是currentthread,那么我們去填充lock()和unlock()方法的時候是不是注意要抓住currentthread這個關鍵字就可以找到解決方案呢?答案是肯定的。

接著分析,使用synchronized的時候如何讓線程等待呢?是用wait()方法。怎么讓線程喚醒呢,是用notify()方法。那么就要在lock()方法中使用wait()方法,在unlock()方法中使用notify()方法。那么我們在使用wait()和notify()的時候是有一個條件的,想想我們應該使用什么作為條件呢?

我們應該使用當前鎖是否被占用作為判斷條件,如果鎖被占用,currentthread等待,想想我們在使用synchronized的時候是不是一直使用的這個條件,答案也是肯定的。

再來分析一下什么時候釋放鎖,使用什么作為條件,想想如果線程A拿到了鎖,線程B能釋放嗎?當然不能,如果B能釋放就違反了原則,當然不能。肯定是A線程的鎖只能A來釋放。所以判斷條件就是判斷持有鎖的線程是不是currentthread,如果是的話,可以釋放,不是的話當然不能。

現在來看看完整的代碼:

?
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
package test.lock;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class NaiveLock {
    private static final long NONE = -1;
    private long owner = NONE;
    private Boolean isLooked() {
        return owner != NONE;
    }
    public synchronized void lock() {
        long currentThreadId = Thread.currentThread().getId();
        if (owner == currentThreadId) {
            throw new IllegalStateException("Lock has been acquired by current thread");
        }
        while (this.isLooked()) {
            System.out.println(String.format("thread %s is waitting lock", currentThreadId));
            try {
                wait();
            }
            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        owner = currentThreadId;
        System.out.println(String.format("Lock is acquired by thread %s", owner));
    }
    public synchronized void unlock() {
        if (!this.isLooked() || owner != Thread.currentThread().getId()) {
            throw new IllegalStateException("Only Lock owner can unlock the lock");
        }
        System.out.println(String.format("thread %s is unlocking", owner));
        System.out.println();
        owner = NONE;
        notify();
    }
    public static void main(String[] args) {
        final NaiveLock lock = new NaiveLock();
        ExecutorService executor = Executors.newFixedThreadPool(20, new ThreadFactory() {
            private ThreadGroup group = new ThreadGroup("test thread group");
            {
                group.setDaemon(true);
            }
            @Override
                  public Thread newThread(Runnable r) {
                return new Thread(group, r);
            }
        }
        );
        for (int i = 0; i < 20; i++) {
            executor.submit(new Runnable() {
                @Override
                        public void run() {
                    lock.lock();
                    System.out.println(String.format("thread %s is running...", Thread.currentThread().getId()));
                    try {
                        Thread.sleep(new Random().nextint(1000));
                    }
                    catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    lock.unlock();
                }
            }
            );
        }
    }
}

運行一下看看結果:

?
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
Lock is acquired by thread 8
thread 8 is running...
thread 27 is waitting lock
thread 26 is waitting lock
thread 25 is waitting lock
thread 24 is waitting lock
thread 23 is waitting lock
thread 22 is waitting lock
thread 21 is waitting lock
thread 20 is waitting lock
thread 19 is waitting lock
thread 18 is waitting lock
thread 17 is waitting lock
thread 16 is waitting lock
thread 15 is waitting lock
thread 14 is waitting lock
thread 13 is waitting lock
thread 12 is waitting lock
thread 11 is waitting lock
thread 10 is waitting lock
thread 9 is waitting lock
thread 8 is unlocking
 
Lock is acquired by thread 27
thread 27 is running...
thread 27 is unlocking
 
Lock is acquired by thread 26
thread 26 is running...
thread 26 is unlocking
 
Lock is acquired by thread 25
thread 25 is running...
thread 25 is unlocking
 
Lock is acquired by thread 24
thread 24 is running...
thread 24 is unlocking
 
Lock is acquired by thread 23
thread 23 is running...
thread 23 is unlocking
 
Lock is acquired by thread 22
thread 22 is running...
thread 22 is unlocking
 
Lock is acquired by thread 21
thread 21 is running...
thread 21 is unlocking
 
Lock is acquired by thread 20
thread 20 is running...
thread 20 is unlocking
 
Lock is acquired by thread 19
thread 19 is running...
thread 19 is unlocking
 
Lock is acquired by thread 18
thread 18 is running...
thread 18 is unlocking
 
Lock is acquired by thread 17
thread 17 is running...
thread 17 is unlocking
 
Lock is acquired by thread 16
thread 16 is running...
thread 16 is unlocking
 
Lock is acquired by thread 15
thread 15 is running...
thread 15 is unlocking
 
Lock is acquired by thread 14
thread 14 is running...
thread 14 is unlocking
 
Lock is acquired by thread 13
thread 13 is running...
thread 13 is unlocking
 
Lock is acquired by thread 12
thread 12 is running...
thread 12 is unlocking
 
Lock is acquired by thread 11
thread 11 is running...
thread 11 is unlocking
 
Lock is acquired by thread 10
thread 10 is running...
thread 10 is unlocking
 
Lock is acquired by thread 9
thread 9 is running...
thread 9 is unlocking

如果把for循環改成30次,再看一下結果:

?
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
Lock is acquired by thread 8
thread 8 is running...
thread 27 is waitting lock
thread 26 is waitting lock
thread 25 is waitting lock
thread 24 is waitting lock
thread 23 is waitting lock
thread 22 is waitting lock
thread 21 is waitting lock
thread 20 is waitting lock
thread 19 is waitting lock
thread 18 is waitting lock
thread 17 is waitting lock
thread 16 is waitting lock
thread 15 is waitting lock
thread 14 is waitting lock
thread 13 is waitting lock
thread 12 is waitting lock
thread 11 is waitting lock
thread 10 is waitting lock
thread 9 is waitting lock
thread 8 is unlocking
 
Lock is acquired by thread 27
thread 27 is running...
thread 8 is waitting lock
thread 27 is unlocking
 
Lock is acquired by thread 27
thread 27 is running...
thread 26 is waitting lock
thread 27 is unlocking
 
Lock is acquired by thread 27
thread 27 is running...
thread 25 is waitting lock
thread 27 is unlocking
 
Lock is acquired by thread 24
thread 24 is running...
thread 27 is waitting lock
thread 24 is unlocking
 
Lock is acquired by thread 23
thread 23 is running...
thread 24 is waitting lock
thread 23 is unlocking
 
Lock is acquired by thread 22
thread 22 is running...
thread 23 is waitting lock
thread 22 is unlocking
 
Lock is acquired by thread 22
thread 22 is running...
thread 21 is waitting lock
thread 22 is unlocking
 
Lock is acquired by thread 22
thread 22 is running...
thread 20 is waitting lock
thread 22 is unlocking
 
Lock is acquired by thread 22
thread 22 is running...
thread 19 is waitting lock
thread 22 is unlocking
 
Lock is acquired by thread 22
thread 22 is running...
thread 18 is waitting lock
thread 22 is unlocking
 
Lock is acquired by thread 17
thread 17 is running...
thread 17 is unlocking
 
Lock is acquired by thread 16
thread 16 is running...
thread 16 is unlocking
 
Lock is acquired by thread 15
thread 15 is running...
thread 15 is unlocking
 
Lock is acquired by thread 14
thread 14 is running...
thread 14 is unlocking
 
Lock is acquired by thread 13
thread 13 is running...
thread 13 is unlocking
 
Lock is acquired by thread 12
thread 12 is running...
thread 12 is unlocking
 
Lock is acquired by thread 11
thread 11 is running...
thread 11 is unlocking
 
Lock is acquired by thread 10
thread 10 is running...
thread 10 is unlocking
 
Lock is acquired by thread 9
thread 9 is running...
thread 9 is unlocking
 
Lock is acquired by thread 8
thread 8 is running...
thread 8 is unlocking
 
Lock is acquired by thread 26
thread 26 is running...
thread 26 is unlocking
 
Lock is acquired by thread 25
thread 25 is running...
thread 25 is unlocking
 
Lock is acquired by thread 27
thread 27 is running...
thread 27 is unlocking
 
Lock is acquired by thread 24
thread 24 is running...
thread 24 is unlocking
 
Lock is acquired by thread 23
thread 23 is running...
thread 23 is unlocking
 
Lock is acquired by thread 21
thread 21 is running...
thread 21 is unlocking
 
Lock is acquired by thread 20
thread 20 is running...
thread 20 is unlocking
 
Lock is acquired by thread 19
thread 19 is running...
thread 19 is unlocking
 
Lock is acquired by thread 18
thread 18 is running...
thread 18 is unlocking

總結

以上就是本文關于使用synchronized實現一個Lock代碼詳解的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/zpf336/article/details/52096409

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 嫩草在线视频www免费观看 | 国产免费午夜 | 無码一区中文字幕少妇熟女网站 | 爱情岛永久成人免费网站 | 五月丁开婷婷 | 免费国产之a视频 | 男人疯狂擦进女人下面 | 久久噜国产精品拍拍拍拍 | 236宅宅2021最新理论 | 果冻传媒在线视频播放观看 | 美女用手扒自己下部 | 好男人资源大全免费观看 | porno movie hd高清 | 歪歪视频在线播放无遮挡 | 97视频久久久 | 亚洲国产经典 | 99色在线播放 | 2020韩国三级理论在线观看 | 日本连裤袜xxxxx在线视频 | 性做久久久久久 | 娇小性色 | 国产精品免费久久久久影院小说 | 亚洲日韩精品欧美一区二区一 | 国产日韩精品一区二区三区 | 国产激情一区二区三区成人91 | 国产成人精品午夜在线播放 | 99久久国产综合精品女小说 | 国产精品亚洲专区在线播放 | 色欲麻豆国产福利精品 | 免费看男女污污完整版 | 香港论理午夜电影网 | 国产美女亚洲精品久久久久久 | 免费看国产精品麻豆 | 日本人妖网站 | 久久成人亚洲 | 日韩一区二区三区不卡视频 | 色久久一个亚洲综合网 | 麻豆最新| 国产精品人人视频 | 亚洲AV人无码综合在线观看蜜桃 | 免费高清视频日本 |