标签:状态 写文件 非公平锁 数据 方法 休眠 读锁 锁定 现象
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能够提供比排他锁更好的并发性和吞吐量。
标签:状态 写文件 非公平锁 数据 方法 休眠 读锁 锁定 现象
原文地址:https://www.cnblogs.com/jis121/p/11037370.html