博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lock和synchronized的选择
阅读量:6252 次
发布时间:2019-06-22

本文共 2499 字,大约阅读时间需要 8 分钟。

学习资源:

一.java.util.concurrent.locks包下常用的类

1.Lock

public interface Lock {

    
void 
lock();//用来获取锁。如果锁已被其他线程获取,则进行等待。
 
    
void 
lockInterruptibly() 
throws 
InterruptedException;//当通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。也就使说,当两个线程同时通过lock.lockInterruptibly()想获取某个锁时,假若此时线程A获取到了锁,而线程B只有在等待,那么对线程B调用threadB.interrupt()方法能够中断线程B的等待过程。
 
    
boolean 
tryLock();//是有返回值的,它表示用来尝试获取锁,如果获取成功,则返回true,如果获取失败(即锁已被其他线程获取),则返回false,也就说这个方法无论如何都会立即返回。在拿不到锁时不会一直在那等待。
 
    
boolean tryLock(long 
time, TimeUnit unit) 
throws 
InterruptedException;//和tryLock()方法是类似的,只不过区别在于这个方法在拿不到锁时会等待一定的时间,在时间期限之内如果还拿不到锁,就返回false。如果如果一开始拿到锁或者在等待期间内拿到了锁,则返回true。
 
    void unlock();
    Condition newCondition();
}

2.ReentrantLock

  ReentrantLock,意思是“可重入锁”。ReentrantLock是唯一实现了Lock接口的类

3.ReadWriteLock

  一个用来获取读锁,一个用来获取写锁。也就是说将文件的读写操作分开,分成2个锁来分配给线程,从而使得多个线程可以同时进行读操作

public interface ReadWriteLock {

    
/**
     
* Returns the lock used for reading.
     
*
     
* @return the lock used for reading.
     
*/
    
Lock readLock();
 
    
/**
     
* Returns the lock used for writing.
     
*
     
* @return the lock used for writing.
     
*/
    
Lock writeLock();
}
4.ReentrantReadWriteLock
  ReentrantReadWriteLock实现了ReadWriteLock接口。

Lock和synchronized的选择

  总结来说,Lock和synchronized有以下几点不同:

  1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现;

  2)synchronized在发生异常时,会自动释放线程占有的锁,因此不会导致死锁现象发生;而Lock在发生异常时,如果没有主动通过unLock()去释放锁,则很可能造成死锁现象,因此使用Lock时需要在finally块中释放锁;

  3)Lock可以让等待锁的线程响应中断,而synchronized却不行,使用synchronized时,等待的线程会一直等待下去,不能够响应中断;

  4)通过Lock可以知道有没有成功获取锁,而synchronized却无法办到。

  5)Lock可以提高多个线程进行读操作的效率。

  在性能上来说,如果竞争资源不激烈,两者的性能是差不多的,而当竞争资源非常激烈时(即有大量线程同时竞争),此时Lock的性能要远远优于synchronized。所以说,在具体使用时要根据适当情况选择。

 

1.可重入锁

  如果锁具备可重入性,则称作为可重入锁。像synchronized和ReentrantLock都是可重入锁,可重入性在我看来实际上表明了锁的分配机制:基于线程的分配,而不是基于方法调用的分配。举个简单的例子,当一个线程执行到某个synchronized方法时,比如说method1,而在method1中会调用另外一个synchronized方法method2,此时线程不必重新去申请锁,而是可以直接执行方法method2。

2.可中断锁

  可中断锁:顾名思义,就是可以相应中断的锁。

  在Java中,synchronized就不是可中断锁,而Lock是可中断锁。

  如果某一线程A正在执行锁中的代码,另一线程B正在等待获取该锁,可能由于等待时间过长,线程B不想等待了,想先处理其他事情,我们可以让它中断自己或者在别的线程中中断它,这种就是可中断锁。

  在前面演示lockInterruptibly()的用法时已经体现了Lock的可中断性。

3.公平锁

  公平锁即尽量以请求锁的顺序来获取锁。比如同是有多个线程在等待一个锁,当这个锁被释放时,等待时间最久的线程(最先请求的线程)会获得该所,这种就是公平锁。

  非公平锁即无法保证锁的获取是按照请求锁的顺序进行的。这样就可能导致某个或者一些线程永远获取不到锁。

  在Java中,synchronized就是非公平锁,它无法保证等待的线程获取锁的顺序。

  而对于ReentrantLock和ReentrantReadWriteLock,它默认情况下是非公平锁,但是可以设置为公平锁。

4.读写锁

  读写锁将对一个资源(比如文件)的访问分成了2个锁,一个读锁和一个写锁。

  正因为有了读写锁,才使得多个线程之间的读操作不会发生冲突。

  ReadWriteLock就是读写锁,它是一个接口,ReentrantReadWriteLock实现了这个接口。

  可以通过readLock()获取读锁,通过writeLock()获取写锁。

转载于:https://www.cnblogs.com/Rage-Leila/p/8582327.html

你可能感兴趣的文章
datagrid排序 java_easyUI 自定义排序datagrid
查看>>
sine之舞 java_JAVA程序实例:Sine之舞的游戏之Java版
查看>>
java实现建权授权_JAVA项目实现授权 (一)-Go语言中文社区
查看>>
java h5服务器推送事件_服务器推送事件的详细介绍
查看>>
python图像转字符画_Python 实现图片转字符画(动图也能转)
查看>>
php hash 解密,emlog使用PHP5.5自带password_hash()函数
查看>>
php让提交表单的数据保留,php基础教程--表单验证(必填、提交后数据保留)
查看>>
java类可选,类层次结构中的Java可选接口
查看>>
php 二维数组分页效率,PHP二维数组分页排序分页_PHP数组分页
查看>>
php网站开发开题报告,基于PHP的网上租车租赁网站设计与实现开题报告
查看>>
用matlab怎样表示褶积,信号的时域表示以及卷积运算(MATLAB)
查看>>
mysql 命令 字符集,MySQL字符集的设置
查看>>
php登录半透明,WordPress透明OAuth 1.0使用PHP登录
查看>>
php开发信息发布平台思路,基于PHP的大学信息发布平台设计与实现.doc
查看>>
php使用163使用465端口吗,在CentOS 7系统里使用465端口发送邮件
查看>>
java关联vss 80020009,80020009: Invalid password[src=SourceSafe,guid=null]
查看>>
java复制文件到指定文件夹下,java:把一个文件夹中的所有文件复制到指定文件夹下...
查看>>
matlab足球赛排名问题程序,足球队排名问题及解决方法.doc
查看>>
ubuntu php5-imap,在Ubuntu 11上安装具有IMAP / Kerberos支持的PHP的问题
查看>>
php圣经 源码,基于PHP的圣经读者用剑模块和diatheke
查看>>