目录
一:Lock锁
从JDK5.0开始,java提供了更强大的线程同步机制--通过显式定义同步锁对象来实现同步,同步锁使用Lock对象充当。
ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,在实现多线程安全的控制中,比较常用的是ReentrantLock,可以显式加锁、释放锁
二:Lock代码演示:
class Windows implements Runnable {
private int ticket = 100;
//1、实例化ReentrantLock
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
try {
//2.调用Lock()
lock.lock();
if (ticket > 0) {
/* try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
System.out.println(Thread.currentThread().getName() + ":售票,票号为" + ticket);
ticket--;
} else {
break;
}
} finally {
lock.unlock();//调用解锁方法
}
}
}
}
public class LockTest {
public static void main(String[] args) {
Windows ws = new Windows();
Thread t = new Thread(ws);
Thread t1 = new Thread(ws);
Thread t2 = new Thread(ws);
t.setName("窗口1");
t1.setName("窗口2");
t2.setName("窗口3");
t.start();
t1.start();
t2.start();
}
}三:synchronized与Lock的对比
Lock是显式锁(手动开启和关闭锁),synchronized是隐式锁,出了作用域自动释放
Lock只有代码块锁,synchronized有代码块锁和方法锁
使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)
四:常见面试题:
面试题:synchronized与lock异同:
相同点:
都是用来解决线程安全问题的
不同点:
synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器
Lock需要手动的启动同步(Lock()),同时结束同步也需要手动实现(unLock())
五:优先使用顺序
Lock-》同步代码快(已经进入了方法体,分配了相应资源)-》同步方法(在方法体外)
版权声明:本文为v1xiaolin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。