首页 > 编程知识 正文

java死锁代码示例,java活锁图解

时间:2023-05-03 19:39:49 阅读:31489 作者:684

JAVA平台提供了多种实现,包括同步和保留锁定,作为同时共享和保持数据一致性的工具。 这些提供的锁便于我们开发,但很少提到锁的具体性质和类型。 本系列文章分析了JAVA中常见的锁定名称和特性,并解决了疑问。

阻塞锁

阻塞与旋转锁定不同,它改变线程的执行状态。

在JAVA环境中,线程Thread具有以下状态:

1 .新状态

2 .就绪状态

3、运行状态

4、阻塞状态

5、死亡状态

块块可以说是将线程置于块状态并等待,并且在获得适当的信号(唤醒、时间)时,才进入线程就绪状态。 处于就绪状态的所有线程都因冲突而进入运行状态。

JAVA使用synchronized关键字(中的重量锁定)、ReentrantLock、Object.wait ()notify (锁定支持. park ) )在块中

以下是JAVA阻止锁的示例:

打包锁;

import Java.util.concurrent.atomic.atomicreferencefieldupdater;

import Java.util.concurrent.locks.lock support;

公共类时钟1 {

公共静态类cl hnode {

私有电压线程锁定;

}

(@suppresswarnings('unused ' ) ) ) ) ) ) ) ) ) )

私有电压节点故障;

私密性testaticfinalthreadlocallocal=new thread local (;

privatestaticfinalatomicreferencefieldupdaterupdater=atomicreferencefieldupdater.new updater (clhlock1. class,

CLHNode.class,' tail ';

公共语音锁定() {

CLHNode node=new CLHNode (;

本地. set (node;

clhnodeprenode=updater.getan dset (this,node );

预节点!=空) {

pre node.islocked=thread.current thread (;

locksupport.Park(this

预节点=null;

本地. set (node;

}

}

公共语音解锁

CLHNode node=LOCAL.get (;

if (! udater.compareandset(this,node,null ) }

system.out.println(unlock(t ) node.islocked.getname );

lock support.un park (node.islocked;

}

节点=null;

}

}

我们在这里使用了LockSupport.unpark ()上的阻塞锁。 此示例是对CLH锁定的修改。

块锁定的优点是,被阻止的线程不占用cpu时间,cpu利用率不会过高,但访问时间和恢复时间比旋转锁定慢一些。

在竞争激烈的情况下,阻塞锁的性能明显高于自旋锁。

理想情况下; 线程竞争不激烈时使用旋转锁定,竞争激烈时阻止锁定。

(全文结束)。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。