义乌商城集团网站建设,二次元动漫网站设计方案,官网网站设计费用,营销型网站建设jm3qsynchronized和lock的区别 synchronized和Lock#xff0c;我已经通过源码级别的介绍过了#xff0c;下面我们来总结下他们的区别 区别#xff1a;
1.synchronized是关键字,Lock是接口#xff0c;synchronized是JVM层实现#xff0c;Lock是JDK中JUC包下的实现#xff1b;…synchronized和lock的区别 synchronized和Lock我已经通过源码级别的介绍过了下面我们来总结下他们的区别 区别
1.synchronized是关键字,Lock是接口synchronized是JVM层实现Lock是JDK中JUC包下的实现
2.synchronized是隐式的加锁,lock是显式的加锁;
3.synchronized可以作用于方法上,lock只能作用于方法块;
4.synchronized底层采用的是objectMonitor,lock采用的AQS;
5.synchronized是阻塞式加锁,lock是非阻塞式加锁支持可中断式加锁, 支持超时时间的加锁;
6.synchronized在进行加锁解锁时,只有一个同步队列和一个等待队列, lock有一个同步队列,可以有多个等待队列;
7.synchronized只支持非公平锁,lock支持非公平锁和公平锁;
8.synchronized使用了object类的wait和notify进行等待和唤醒, lock使用了condition接口进行等待和唤醒(await和signal);
9.lock支持个性化定制, 使用了模板方法模式,可以自行实现lock方法; 10. synchronized在发生异常和同步块结束的时候会自动释放锁。而Lock必须手动释放 所以如果忘记了释放锁一样会造成死锁。
相同点
1.Lock是一个接口为了使用一个Lock对象需要用到
2.Lock lock new ReentrantLock();
3.与 synchronized (someObject) 类似的lock()方法表示当前线程占用lock对象一旦占用其他线程就不能占用了
4.与synchronized 不同的是一旦synchronized 块结束就会自动释放对someObject的占用。 lock却必须调用unlock方法进行手动释放为了保证释放的执行往往会把unlock() 放在finally中进行
5.synchronized 是不占用到手不罢休的会一直试图占用下去
6.与 synchronized 的钻牛角尖不一样Lock接口还提供了一个trylock方法
7.trylock会在指定时间范围内试图占用。 如果时间到了还占用不成功就选择放弃
注意 因为使用trylock有可能成功有可能失败所以后面unlock释放锁的时候需要判断是否占用成功了如果没占用成功也unlock,就会抛出异常
8.使用synchronized方式进行线程交互用到的是同步对象的wait,notify和notifyAll方法
9.Lock也提供了类似的解决办法首先通过lock对象得到一个Condition对象然后分别调用这个Condition对象的await, signal,signalAll 方法
注意 不是Condition对象的wait,nofity,notifyAll方法,是await,signal,signalAll
参考
史上最详细JUC教程之Synchronized与锁升级详解 谈谈Java多线程离不开的AQS