根据我的理解,下面的代码应该导致死锁.
原因是,当线程t1锁定静态对象firstData时,他已经获得了对类的锁定.因此,当他试图锁定另一个静态对象secondData时,请求应该阻塞.

但是,程序运行正常并打印***成功获得了两个锁

锁定静态对象的原因是什么?

public class Deadlock {
    public static void main(String[] args) {

        Thread t1 = new Thread(new DeadlockRunnable());
        t1.start();
    }
} 

 class DeadlockRunnable implements Runnable {
    static  Object firstData = new Object();
    static  Object secondData = new Object();

    public void run() {
        synchronized(firstData) {
            synchronized(secondData) {
                System.out.println("*** Successfully acquired both the locks");
            }
        }
    }

}

对于那些回答锁是对象而不是课堂的人,请看一下this

解决方法

首先,你有一个错误:

The reason being,when thread t1 locks static object firstData,he has acquired a lock on the class.

锁定静态对象仅锁定该对象,而不是类.您正在锁定两个单独的对象.

question you refered to大约是synchronized methods而不是synchronized statements.这两个相关结构的工作方式略有不同.

其次,即使您锁定了同一个对象,您的代码仍然不会死锁(ideone).内在锁是可重入的.这意味着如果线程尝试两次使用相同的锁,则线程不会自行死锁.

Reentrant Synchronization

Recall that a thread cannot acquire a lock owned by another thread. But a thread can acquire a lock that it already owns. Allowing a thread to acquire the same lock more than once enables reentrant synchronization. This describes a situation where synchronized code,directly or indirectly,invokes a method that also contains synchronized code,and both sets of code use the same lock. Without reentrant synchronization,synchronized code would have to take many additional precautions to avoid having a thread cause itself to block.

Source

java – 锁定类的静态成员的更多相关文章

  1. Swift中隐式懒惰的静态成员

    我只是注意到Swift结构的静态成员是隐式的.例如,这只会调用init一次:这背后的理由是什么?如果我想要相反的行为怎么办?

  2. Springboot如何通过yml配置文件为静态成员变量赋值

    这篇文章主要介绍了Springboot如何通过yml配置文件为静态成员变量赋值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  3. php静态成员方法和静态的成员属性的使用方法

    这篇文章主要介绍了php静态成员方法和静态的成员属性的使用方法的相关资料,希望通过本文能帮助到大家,让大家使用的时候注意方法,需要的朋友可以参考下

  4. 使用Microsoft.Extensions.Logging从静态成员进行日志记录

    DI对于静力学并不好玩.从某种意义上说,它们是一种对立的设计哲学.ASP.NET大量使用静态(HttpContext,任何人?

  5. java – 锁定类的静态成员

    根据我的理解,下面的代码应该导致死锁.原因是,当线程t1锁定静态对象firstData时,他已经获得了对类的锁定.因此,当他试图锁定另一个静态对象secondData时,请求应该阻塞.但是,程序运行正常并打印***成功获得了两个锁锁定静态对象的原因是什么?

  6. java – 为什么静态成员使语言不像面向对象?

    解决方法奥德斯基的陈述是有效和重要的,但有些人不明白他的意思.让我们说在Java中你有一个方法f的类Foo:你可以编写一个接受Foo并在其上调用f的方法:也许有一个类SubFoo扩展了Foo;g也适用于此.可以有一整套类,通过继承或接口相关,它们共享它们可以与g一起使用的事实.现在让我们将f方法设为静态:我们可以使用这个新的Foo和g,也许是这样吗?

  7. java – 泛型类共享静态成员吗​​?

    2个我想问一下泛型类.当我从泛型类创建两个对象实例时会发生什么.他们是否共享每个静态成员,或者两者都拥有自己的静态成员?解决方法产量所以,是的,这两个实例共享相同的成员变量.

  8. c – 为什么类的静态成员函数没有“常量正确性”的概念?

    背后的任何逻辑原因?解决方法cv-qualifiers影响函数的签名.所以你可以有:现在…没有const对象可以调用它.我只是在这里猜测,可能还有其他原因.总结以上是DEVMAX为你收集整理的c–为什么类的静态成员函数没有“常量正确性”的概念?如果觉得DEVMAX网站内容还不错,欢迎将DEVMAX网站推荐给好友。

  9. c# – 为什么不能通过实例名称访问静态成员?

    该实例不能有一个同名的成员,所以我不知道这对编译器来说是多么模糊或不可解析.任何人都知道为什么会这样?解决方法另一个角度:假设这是可能的.当你通过一个null的实例变量访问静态成员时,你会想要的结果是什么?您想要一个空引用异常?或者你希望它能工作?无论哪种方式都有问题.

  10. c – 将传递条件作为模板参数与sort()的比较导致比将条件函数指针传递给qsort()的开销更少?

    解决方法std::sort是一个功能模板.在编译期间,将为每个类型和比较运算符创建单独的排序实例.并且因为对于每个排序实例化,类型和比较器在编译时是已知的,这允许内联比较器功能并因此避免函数调用的成本.

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部