本文主要介绍了Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)多线程tryLock()方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
tryLock(长时间,时间单位单位)的作用在给定等待时长内锁没有被另外的线程持有,并且当前线程也没有被中断,则获得该锁,通过该方法可以实现锁对象的限时等待。
包com。wk CTO。锁定。可重入;
导入Java。util。并发。时间单位;
导入Java。util。并发。锁。重入锁;
/**
*tryLock(长时间,时间单位单位)的基本使用
*/
公共类测试07 {
静态类时间锁链实现可运行{
私有静态可重入锁lock=new reentrant lock();//定义锁对象
@覆盖
公共无效运行(){
尝试{
if ( lock.tryLock(3,TimeUnit .秒)){ //获得锁返回真实的
系统。出去。println(线程。当前线程().getName()'获得锁,执行耗时任务');
//线程。睡眠(4000);//假设线程-0线程先持有锁,完成任务需要四秒钟,线程一线程尝试获得锁,线程一线程在3秒内还没有获得锁的话,线程一线程会放弃
线程。睡眠(2000年);//假设线程-0线程先持有锁,完成任务需要2秒钟,线程一线程尝试获得锁,线程一线程会一直尝试,在它约定尝试的3秒内可以获得锁对象
}else { //没有获得锁
系统。出去。println(线程。当前线程().getName()'没有获得锁');
}
} catch (InterruptedException e) {
e。printstacktrace();
}最后{
如果(锁定。isheldbycurrentthread()){
锁定。unlock();
}
}
}
}
公共静态void main(String[] args) {
time lock time lock=new time lock();
线程t1=新线程(时间锁定);
线程t2=新线程(时间锁定);
t1。start();
T2。start();
}
}
tryLock()仅在调用时锁定未被其他线程持有的锁,如果调用方法时,锁对象对其他线程持有,则放弃,调用方法尝试获得没,如果该锁没有被其他线程占用则返回真实的表示锁定成功;如果锁被其他线程占用则返回假的,不等待。
包com。wk CTO。锁定。可重入;
导入Java。util。并发。锁。重入锁;
/**
*tryLock()
* 当锁对象没有被其他线程持有的情况下才会获得该锁定
*/
公共类测试08 {
静态类服务{
私有重入锁lock=新重入锁();
public void serviceMethod(){
尝试{
if (lock.tryLock()){
系统。出去。println(线程。当前线程().getName()'获得锁定');
线程。睡眠(3000);//模拟执行任务的时长
}否则{
系统。出去。println(线程。当前线程().getName()'没有获得锁定');
}
} catch (InterruptedException e) {
e。printstacktrace();
}最后{
如果(锁定。isheldbycurrentthread()){
锁定。unlock();
}
}
}
}
公共静态void main(String[] args)引发中断的异常{
Service Service=new Service();
Runnable r=new Runnable() {
@覆盖
公共无效运行(){
服务。服务方法();
}
};
线程t1=新线程(r);
t1。start();
线程。睡眠(50);//睡眠50毫秒,确保一种网络的名称(传输率可达1.54mbps)级(一种通讯线路的名称)线程锁定
线程t2=新线程(r);
T2。start();
}
}
包com。wk CTO。锁定。可重入;
导入Java。util。随机;
导入Java。util。并发。锁。重入锁;
/**
* 使用tryLock()可以避免死锁
*/
公共类测试09 {
静态类IntLock实现可运行{
私有静态可重入锁lock 1=new reentrant lock();
私有静态可重入锁lock 2=new reentrant lock();
private int lockNum//用于控制锁的顺序
public IntLock(int lockNum) {
this.lockNum=lockNum
}
@覆盖
公共无效运行(){
if ( lockNum % 2==0 ){ //偶数先锁1,再锁2
while (true){
尝试{
if (lock1.tryLock()){
系统。出去。println(线程。当前线程().getName()'获得锁1, 还想获得锁2');
线程.睡眠(新随机()。nextInt(100));
尝试{
if (lock2.tryLock()){
系统。出去。println(线程。当前线程().getName()'同时获得锁一与锁2 - 完成任务了');
返回;//结束运行()方法执行,即当前线程结束
}
}最后{
如果(锁2。isheldbycurrentthread()){
2号锁。unlock();
}
}
}
} catch (InterruptedException e) {
e。printstacktrace();
}最后{
如果(锁1。isheldbycurrentthread()){
一号锁。unlock();
}
}
}
}else { //奇数就先锁2,再锁一
while (true){
尝试{
if (lock2.tryLock()){
系统。出去。println(线程。当前线程().getName()'获得锁2, 还想获得锁1');
线程.睡眠(新随机()。nextInt(100));
尝试{
if (lock1.tryLock()){
系统。出去。println(线程。当前线程().getName()'同时获得锁一与锁2 - 完成任务了');
返回;//结束运行()方法执行,即当前线程结束
}
}最后{
如果(锁1。isheldbycurrentthread()){
一号锁。unlock();
}
}
}
} catch (InterruptedException e) {
e。printstacktrace();
}最后{
如果(锁2。isheldbycurrentthread()){
2号锁。unlock();
}
}
}
}
}
}
公共静态void main(String[] args) {
int lock int lock 1=new int lock(11);
int lock int lock 2=new int lock(22);
线程t1=新线程(int lock 1);
线程t2=新线程(int lock 2);
t1。start();
T2。start();
//运行后,使用tryLock()尝试获得锁,不会傻傻的等待,通过循环不停的再次尝试,如果等待的时间足够长,线程总是会获得想要的资源
}
}
到此这篇关于详解Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)多线程tryLock()方法使用的文章就介绍到这了,更多相关Java tryLock()内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。