同步锁Lock

Lock(锁)

  • 从JDK5.0开始,Java提供了更强大的线程同步机制,通过显示定义同步锁对象来实现同步。同步锁使用Lock对象充当。
  • java.util.concurrent.locks.Lock接口是控制多个线程对共享资源访问的工具。每次只能有一个线程对Lock对象加锁。
  • ReentranLock(可重入锁)类实现了Lock,在实现线程安全控制中比较常用。

代码演示

package MultiProcess;

public class TestLock {
    public static void main(String[] args) {
        TestLock1 thread1 = new TestLock1();

        new Thread(thread1).start();
        new Thread(thread1).start();
        new Thread(thread1).start();
    }
}

class TestLock1 implements Runnable{
    int ticket = 10;

    @Override
    public void run() {
        while(true){
            if(ticket > 0){

                try {
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println(ticket--);
            }
            else{
                break;
            }
        }
    }
}
结果
9
8
10
7
6
5
4
3
2
1
0
-1

加Lock锁

package MultiProcess;

import java.util.concurrent.locks.ReentrantLock;

public class TestLock {
    public static void main(String[] args) {
        TestLock1 thread1 = new TestLock1();

        new Thread(thread1).start();
        new Thread(thread1).start();
        new Thread(thread1).start();
    }
}

class TestLock1 implements Runnable{
    int ticket = 10;
	//定义锁对象
    private final ReentrantLock lock = new ReentrantLock();
    @Override
    public void run() {
        while(true){
            //加锁解锁建议用try,finally完成
            try{
                //加锁
                lock.lock();
                if(ticket > 0){
                    try {
                        Thread.sleep(1000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println(ticket--);
                }
                else{
                    break;
                }
             //finally中解锁
            }finally {
                lock.unlock();
            }
        }
    }
}
结果
10
9
8
7
6
5
4
3
2
1

synchronized与Lock的对比

  • Lock是显示锁,需要手动改开启和关闭。synchronized是隐式锁,出了作用域自动释放。
  • Lock只有代码块锁,synchronized有代码块锁和方法锁。
  • 使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。
  • Lock提供了更多子类,扩展性更好。
  • 优先使用顺序:Lock > 同步代码块 > 同步方法。
原文地址:https://www.cnblogs.com/happysml/p/13839626.html