Lock和Synchronized的比较

时间:2022-08-15 19:57:20

Lock接口

Lock接口可以实现和Synchronized相同的功能, 但是Lock可以实例化为一个对象, 更加体现面向对象的思想, 基本使用方法如下:

     Lock l = ...;
l.lock();
try {
// access the resource protected by this lock
} finally {
l.unlock();
}

 

 

示例代码:

 1 public class Test {
2
3 public static void main(String[] args) {
4 new Test().init();
5 }
6
7 private void init(){
8 Outputer outputer = new Outputer();
9 //新建第一个线程
10 new Thread(new Runnable(){
11 public void run() {
12 while(true){
13 try {
14 Thread.sleep(10);
15 } catch (InterruptedException e) {
16 e.printStackTrace();
17 }
18 outputer.output("shen_smile");
19 }
20 }
21 }).start();
22 //新建第二个线程
23 new Thread(new Runnable(){
24 public void run() {
25 while(true){
26 try {
27 Thread.sleep(10);
28 } catch (InterruptedException e) {
29 e.printStackTrace();
30 }
31 outputer.output("LockTest");
32 }
33 }
34 }).start();
35 }
36 //静态内部类
37 static class Outputer{
38 Lock lock = new ReentrantLock();//新建一个锁对象
39 public void output(String name){
40 int len = name.length();
41 lock.lock();
42 try{
43 for(int i=0;i<len;i++){
44 System.out.print(name.charAt(i));
45 }
46 System.out.println();
47 }finally{
48 lock.unlock();
49 }
50 }
51 //用synchronized实现代码段的互斥调用
52 public synchronized void output2(String name){
53 int len = name.length();
54 for(int i=0;i<len;i++){
55 System.out.print(name.charAt(i));
56 }
57 System.out.println();
58 }
59 }
60 }

总结:

1. 当两个线程都使用同一个Outputer类的对象的同一个output方法时, 各个线程之间就能实现互斥调用

2. Lock和 Synchronized具有相同的功能, 但是 Lock比 Synchronized更加体现面向对象的思想, 因为锁本身就是一个对象