码迷,mamicode.com
首页 > 其他好文 > 详细

synchronized和lock

时间:2019-06-17 00:31:50      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:状态   写文件   非公平锁   数据   方法   休眠   读锁   锁定   现象   

synchronized和lock的区别
(1)Lock是一个接口,而synchronized是Java中的关键字。
(2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生。
而Lock在发生异常时,不会自动是放占有的锁,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁。
(3)Lock可以让等待锁的线程响应中断,线程可以中断去干别的事务,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去。
(4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。
(5)Lock可以提高多个线程进行读操作的效率。
(6)synchronized只支持非公平锁,而Lock支持公平锁和非公平锁。

效率问题
当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象。
Lock可以使得多个线程都只是进行读操作时,线程之间不会发生冲突
但是采用synchronized关键字来实现同步的话,就会导致一个问题,当一个线程在进行读操作时,其他线程只能等待无法进行读操作。

ReentrantLock获取锁的方式:
  a) lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
  b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
  c)tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
  d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断

ReadWriteLock也是一个接口,在它里面只定义了两个方法,readLock()和writeLock()
一个用来获取读锁,一个用来获取写锁。也就是说将文件的读写操作分开,分成2个锁来分配给线程,从而使得多个线程可以同时进行读操作
ReentrantReadWriteLock实现了ReadWriteLock接口

ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,
而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。
在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他锁更好的并发性和吞吐量。

synchronized和lock

标签:状态   写文件   非公平锁   数据   方法   休眠   读锁   锁定   现象   

原文地址:https://www.cnblogs.com/jis121/p/11037370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!