Java 为什么这个短片段不适合多线程应用程序?

Java 为什么这个短片段不适合多线程应用程序?,java,multithreading,synchronization,Java,Multithreading,Synchronization,作为练习,我被问到在编写多线程应用程序时,下面的代码片段是否是一个好的实践。答案是否定的,没有进一步的动机,但我不明白为什么会这样 我认为关键字synchronized可以防止线程相互干扰,而且所有的方法都太小,您不必担心饥饿 public class myThread{ private static int a = 0; public synchronized void incA(){ a++; } public synchronized voi

作为练习,我被问到在编写多线程应用程序时,下面的代码片段是否是一个好的实践。答案是否定的,没有进一步的动机,但我不明白为什么会这样

我认为关键字
synchronized
可以防止线程相互干扰,而且所有的方法都太小,您不必担心饥饿

public class myThread{
    private static int a = 0;
    public synchronized void incA(){
        a++;
    }
    public synchronized void decA(){
        a--;
    }
     public synchronized int getA(){
        return a;
    }
}

上面的代码片段有什么问题?

因为您的代码不是线程安全的。您有一个
静态
变量和实例方法

这不仅“不合适”,而且是错误的


你的方法在
上是同步的
因为它们是实例方法,这意味着你的
MyThread的每个实例都有自己的锁。

因为你的代码是非线程安全的。您有一个
静态
变量和实例方法

这不仅“不合适”,而且是错误的


你的方法在
上是同步的
因为它们是实例方法,这意味着你的
MyThread
的每个实例都有自己的锁。

超慢,每个线程都会等待很长时间。想象一下n个线程在一段时间内运行它(真的),它们只会浪费时间。真的。谢谢你的回答!另外,为什么
a
是静态的
?如果您围绕每个变量访问进行工作以满足同步,那么这会破坏整个线程点。最好是保持线程分开,并允许使用合理的跨线程通信方式,例如使用线程安全计时器和队列。Boris,你提出了一个有趣的观点。这似乎很奇怪。我一直在思考线程,以至于忽略了设置“a”静态。超慢,每个线程都会等待很长时间。想象一下n个线程在一段时间内运行它(真的),它们只会浪费时间。真的。谢谢你的回答!另外,为什么
a
是静态的
?如果您围绕每个变量访问进行工作以满足同步,那么这会破坏整个线程点。最好是保持线程分开,并允许使用合理的跨线程通信方式,例如使用线程安全计时器和队列。Boris,你提出了一个有趣的观点。这似乎很奇怪。我忙于思考线程问题,以至于忽略了设置“a”静态。