Java在对象类或调用类中"同步"

Gho*_*_cs 0 java multithreading

我有一个多线程程序,我想知道使用"synchronized"的方式是正确的.

方式1:我有一个类对象(将被传递给多个线程),在其中称为MyClass:

public synchronized void set(String name) {
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

方式2:我有相同的类,但没有在其set方法中"同步":

public void set(String name) {
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

调用者将执行此操作:

MyClass myclass = new MyClass();
synchronized(myclass) {
    myclass.set("myclass");
}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我哪一个是实现多线程对象共享的正确方法?我很困惑这两个,我试过两个,他们似乎工作正常.

icy*_*com 6

同步方法:

  • 你在一个地方做,
  • 呼叫者不必担心同步,
  • 您不需要在任何需要调用的地方复制代码
  • 最重要的是 - 如果调用者省略同步,这将无效

这取决于上下文,实际上 - 例如在某些情况下,调用者更好地进行同步,因为他们可以决定同步开销是否值得.例如,已知在一个线程上工作的所有调用者都不需要同步,这只会减慢速度.

对于所有不是时间关键的事情,最好避免在凌晨3点喝第5杯咖啡时需要调试的问题,同时你的同事挥动棒球棒并大声喊叫孩子不要提及的话. ..