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利用率不会过高,但访问时间和恢复时间比旋转锁定慢一些。
在竞争激烈的情况下,阻塞锁的性能明显高于自旋锁。
理想情况下; 线程竞争不激烈时使用旋转锁定,竞争激烈时阻止锁定。
(全文结束)。