当前位置: 首页 > 编程笔记 >

java-synchronized 嵌套使用代码详解

公良弘毅
2023-03-14
本文向大家介绍java-synchronized 嵌套使用代码详解,包括了java-synchronized 嵌套使用代码详解的使用技巧和注意事项,需要的朋友参考一下

当synchronized使用过多时,可能会造成死锁,那么死锁到底是怎么一回事呢。先看下面的代码,实现死锁

//死锁的实现
classA
{
publicvoidget(){
System.out.println("A说:我开始启动了,B,给我你的资源");
}
publicvoidsay(){
System.out.println("A获得资源");
}
}
classB
{
publicvoidget(){
System.out.println("B说:我开始启动了,A,给我你的资源");
}
publicvoidsay(){
System.out.println("B获得资源");
}
}
classMyThreadimplementsRunnable
{
publicstaticAa=newA();
publicstaticBb=newB();
publicbooleanflag=false;
publicvoidrun(){
if(flag){
synchronized(a){
a.get();
try{
Thread.sleep(500);
}catch(InterruptedExceptione){}
synchronized(b){ //此同步代码块在另一同步代码块里
a.say();
}
}
}else{
synchronized(b){
b.get();
try{
Thread.sleep(500);
}catch(InterruptedExceptione){}
synchronized(a){ //此同步代码块在另一同步代码块里
b.say();
}
}
}
}
}
publicclassDemo24
{
publicstaticvoidmain(Stringargs[]){
MyThreadmt1=newMyThread();
MyThreadmt2=newMyThread();
mt1.flag=true;
mt2.flag=false;
Threadth1=newThread(mt1);
Threadth2=newThread(mt2);
th1.start();
th2.start();
}
}

以上代码由于 synchronized 的同步造成了死锁,死锁是两个或多个线程同时等待对方的完成,而程序无法继续执行。在解释代码前,首先要明白synchronized到底是怎么一回事。synchronized 定义同步,那么同步的什么,什么和什么同步了?

首先,我们得知道,什么是。在java中,每一个对象都有一个内部锁,如果以方法或代码块用 synchronized 进行声明,那么对象的锁将保护整个方法或代码块,要调用这个方法或者执行这个代码块,必须获得这个对象的。而且,任何时候都只能有一个线程对象执行被保护的代码

在以上代码中,在线程th1启动后,他就获得了a的锁,同时当其休眠完毕,求会申请获得b的锁,而此时,他的a锁没有放弃。在线程th2启动后,他就获得了b的锁,同时当其休眠完毕,求会申请获得a的锁,而此时,他的b锁没有放弃。

两方都握有自己的锁不放弃,而同时申请另一方的锁,所以,此时就造成了死锁

同步,同步的就是线程和对象,将线程和对象进行绑定,获取对象的锁。

注意:通过以上代码可以发现,死锁的必要条件是不放弃已有的锁,而同时申请新锁。所以,要想实现死锁,就会有synchronized的嵌套。

这样才能同时操作两个以上的锁,从而造成死锁

总结

以上就是本文关于java-synchronized 嵌套使用代码详解的全部内容,希望对大家有所帮助。

 类似资料:
  • 本文向大家介绍使用synchronized实现一个Lock代码详解,包括了使用synchronized实现一个Lock代码详解的使用技巧和注意事项,需要的朋友参考一下 刚看到这个题目的时候无从下手,因为觉得synchronized和lock在加锁的方式上有很大不同,比如,看看正常情况下synchronized时如何加锁的。 方式一: 方式二: 从这两种方式来看,锁都是加在{}之间的,我们再来看看L

  • 本文向大家介绍mongodb driver使用代码详解,包括了mongodb driver使用代码详解的使用技巧和注意事项,需要的朋友参考一下 MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 0 前言 全是

  • 本文向大家介绍详解java中的synchronized关键字,包括了详解java中的synchronized关键字的使用技巧和注意事项,需要的朋友参考一下 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到

  • 本文向大家介绍Java中的关键字synchronized 详解,包括了Java中的关键字synchronized 详解的使用技巧和注意事项,需要的朋友参考一下 在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在JDK1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇介绍synchronized关键字的使用方

  • 使用JSF 2.0,我需要显示一个表,其中每一行都包含一个打开弹出窗口的链接。我有两种型号:

  • 前言:我想创建一个已存在代理的代理(使用spring中的cglib包),就像我调用原始方法类时,两个代理的方法都先调用。这有任何意义吗?还是有可能? 问题:当我创建第二个时,我得到异常的重复方法名”newInstance“。 我想使用和在spring代理的所有bean上包装一个代理。例如,我想在所有方法(事务之前和之后的日志)上包装一个代理。 更新:我更喜欢创建代理,而不是AOP。(AOP本身就是