Java 为什么这个多线程代码被破坏了?

Java 为什么这个多线程代码被破坏了?,java,multithreading,Java,Multithreading,为什么以下与多线程相关的示例代码被破坏 public void method1(){ synchronized(intVariable){ } synchronized(stringVariable){ } } public void method2(){ synchronized(stringVariable){ } synchronized(intVariable){ } } 以上两个方法来自同一个类,其中stringV

为什么以下与多线程相关的示例代码被破坏

public void method1(){
    synchronized(intVariable){
    }
    synchronized(stringVariable){
    }
}

public void method2(){
    synchronized(stringVariable){
     }
    synchronized(intVariable){
     }
}
以上两个方法来自同一个类,其中stringVariable和intVariable是实例变量


我认为它不会引起任何问题,至少在线程死锁方面是这样。此代码被破坏还有其他原因吗?

或者您不了解问题,或者您认为这不会导致死锁是正确的

也许他在寻找更隐晦的东西,比如

  • 无法锁定
    int
    字段
  • 锁定
    字符串
    对象是一个非常糟糕的主意,因为您不知道它是如何共享的
但我对此表示怀疑。无论如何,他应该澄清问题和你的答案,因为也许他已经学到了一些东西,只要下次他能把问题弄清楚就好了

作为面试官,如果你有一系列筛选问题,你应该确保在引入应聘者之前,这些问题都被涵盖了。给人力资源部或代理人的调查问卷可能很有用。电话面试通常是一个好的开始。作为一名候选人,我有时要求进行电话面试,只是为了看看是否值得花时间去面对面面试。(例如,如果我严重怀疑它的价值)

你不仅试图说服他们你很适合他们,他们也试图说服你他们很适合你。看来他们没有从技术上向你解释这个问题,也没有从人力资源角度解释他们是如何处理的,所以我认为你很幸运,你没有再浪费时间在他们身上


顺便说一句:大多数大公司都是多元化的,为一个团队工作可能与为另一个团队工作非常不同。根据一次经验来描述一家公司是不公平的。

问题是,假设两个变量都有引用类型(否则无法对其进行同步),那么对一个内容可能会更改的变量进行同步就会中断

变量的第一次读取是在没有同步的情况下完成的,线程将看到的任何引用(可能是一个完全过时的值)都用于同步,这不会阻止其他线程在该变量的不同值上同步,因为它将是一个完全不同的对象

由于
String
Integer
是不可变的,因此变量值的每次更改都意味着更改变量中包含的引用,允许另一个线程进入
synchronized
块,而执行更改的线程仍在该块内


而且,由于操作的合法重新排序,它甚至可能看起来像是第二个线程在第一个线程执行写操作之前在
synchronized
块内执行操作。请记住,要用于同步的引用的读取是不同步的。因此,这就像根本没有同步一样。

你最好在programmers.stackexchange.com上问这个问题,因为这不是一个很好的问题。这个问题似乎离题了,因为它是关于面试问题和练习的。程序员最好在面试中回答这个问题。不过,询问此实现是否会导致您未看到的任何问题可能是本文的主题。