Lock锁

Lock锁

概念

  • 线程同步机制——通过显式定义同步锁对对象来实现同步
  • ReentrantLock实现了Lock,拥有与synchronized相同的并发性和内存语义。

synchronized的缺陷

  • 如果获取锁的线程需要等待或调用了sleep()方法被阻塞了,synchronized不会释放锁,于是其他线程只能等待
  • 有时候的行为并不会造成冲突,比如读和读操作,但synchronized来实现的同步却会拒绝这些操作。
  • 另外Lock可以知道线程有没有得到锁,synchronized不能

Lock和synchronized的区别

  • Lock是一个接口,synchronized是关键字
  • synchronized会自动释放锁,Lock需要手动释放
  • Lock可以让等待的线程响应中断,synchronized不会,所以线程会一直等待下去
  • Lock可以知道线程有没有拿到锁
  • Lock只能锁住块范围,synchronized可以锁住块,方法,类。

测试代码

import java.util.concurrent.locks.ReentrantLock;

/**
 * 测试Lock锁
 */

public class TestLock implements Runnable{

    int ticket = 10;
    final ReentrantLock lock = new ReentrantLock();
    @Override
    public void run() {

        while (true){
            try {
                lock.lock();
                if(ticket > 0) {
                    try {
                        System.out.println(Thread.currentThread().getName() + "-->" + ticket--);
                        Thread.sleep(100);
                    }catch (Exception e){
                    }
                }
                else {
                    break;
                }
            }finally {
                lock.unlock();
            }

        }

    }

    public static void main(String[] args) {

        TestLock t1 = new TestLock();

        new Thread(t1).start();
        new Thread(t1).start();
        new Thread(t1).start();

    }

}
因为我喜欢追寻过程中的自己
原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359788.html