最近老有关于锁的问题,Lock,搞的很神秘的样子,这里写个实例用作比较
1 注释掉锁查看效果
package com.sm.one;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
Lock lock = new ReentrantLock();
int i = 0;
public static void main(String[] args) {
final Test test = new Test();
new Thread(new Runnable() {
@Override
public void run() {
test.init();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
test.init();
}
}).start();
}
public void init() {
try {
// lock.lock();
oper();
} catch (Exception e) {
} finally {
// lock.unlock();
}
}
public void oper() {
for (int j = 0; j < 20; j++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i++;
System.out.println(i);
}
}
}
没锁的结果是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
没有40
2 有锁的情况
package com.sm.one;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Test {
Lock lock = new ReentrantLock();
int i = 0;
public static void main(String[] args) {
final Test test = new Test();
new Thread(new Runnable() {
@Override
public void run() {
test.init();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
test.init();
}
}).start();
}
public void init() {
try {
lock.lock();
oper();
} catch (Exception e) {
} finally {
lock.unlock();
}
}
public void oper() {
for (int j = 0; j < 20; j++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
i++;
System.out.println(i);
}
}
}
结果
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