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