Synchronized关键字小伙伴们应该都知道吧,加锁都需要靠这个家伙,那小伙伴们知道synchronized和lock有哪些区别吗?下面快跟小编来了解了解吧。
一、底层工作机制
synchronized
Java中,synchronized关键字是属于JVM层面实现的,它的底层是通过monitor对象来完成的,其实wait/notify等方法也依赖monitor对象只有在同步代码块和同步方法中才能调用wait/notify等方法。
lock
Lock与synchronized不同,它是一个具体的类,它是java api层面的锁。
二、使用方式详解
synchronized
Synchronized关键字运行后是不需要用户去手动释放锁的,在synchronized代码执行成功后系统会自动让线程释放对锁的占据。
lock
ReentrantLock锁运行后需要用户手动去释放锁,如若用户没有主动去释放锁,就有可能导致出现死锁现象。ReentrantLock需要使用lock()和unlock()方法配合try finally语句块来完成。
三、在程序运行中等待能否中断
synchronized
synchronized不能中断,除非抛出异常或者正常运行完成。
ReetrantLock
ReetrantLock可中断,无影响。
中断方法
1)、设置超时方法tryLock(long timeout, TimeUnit unit)。
2)、把lockInterruptibly()放入代码块中,调用interrupt()方法即可。
四、它们的加锁是否公平
synchronized
否。synchronized是非公平锁。
ReentrantLock
ReentrantLock默认为非公平锁,然可设置为公平锁。
五、它们的锁是否能绑定多个条件condition
synchronized
否,synchronized不能
ReentrantLock
如果使用ReentrantLock来实现分组唤醒需要唤醒的线程们,就可以精确唤醒,不会如synchronized样,要么随机唤醒一个,要么唤醒全部线程。
六、代码示例
例:使用多线程,在它们之间按找顺序调用,实现A->B->C三个线程启动,要求如下:
AA打印5次,BB打印10次,CC打印15次,重复上述过程10次。
class ShareResource { private int number = 1; // A:1, B:2, C:3 private Lock lock = new ReentrantLock(); private Condition conditionA = lock.newCondition(); private Condition conditionB = lock.newCondition(); private Condition conditionC = lock.newCondition(); public void print5() { try { lock.lock(); while (number != 1) { conditionA.await(); } for (int i = 1; i <= 5; i++) { System.out.print("A"); } System.out.println(); number++; conditionB.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void print10() { try { lock.lock(); while (number != 2) { conditionB.await(); } for (int i = 1; i <= 10; i++) { System.out.print("B"); } System.out.println(); number++; conditionC.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void print15() { try { lock.lock(); while (number != 3) { conditionC.await(); } for (int i = 1; i <= 15; i++) { System.out.print("C"); } System.out.println(); number = 1; conditionA.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } } public class SynchronizedLockDifference { public static void main(String[] args) { ShareResource shareResource = new ShareResource(); new Thread(() - > { for (int i = 1; i <= 10; i++) { shareResource.print5(); } }, "A") .start(); new Thread(() - > { for (int i = 1; i <= 10; i++) { shareResource.print10(); } }, "B") .start(); new Thread(() - > { for (int i = 1; i <= 10; i++) { shareResource.print15(); } }, "C") .start(); } }
以上就是关于synchronized和lock区别的全部内容了,小伙伴们如果还想了解更多java关键字相关java架构师知识的话,就请一直关注我们的网站吧。
推荐阅读:
Synchronized和Reentrantlock区别是什么?简单叙述