Java线程和同步

Java线程和同步,java,multithreading,Java,Multithreading,我有一个web应用程序,它使用我编写的一些JAR。 我的挑战是,我的代码中有一个关键(但快速)部分 1-我有一个给定类的对象,该对象有两个静态字段。我们把这个叫做A级 2 A公开了一个访问静态字段的非静态方法。用于阅读和写作。让我们调用此方法doJob 3-每个请求实例化类A的对象,并调用doJob A A=新A();a、 doJob() 4-我假设每个请求都在创建一个新的线程,其中执行doJob 5-如果我将doJob定义为public synchronized void doJob(){//

我有一个web应用程序,它使用我编写的一些JAR。 我的挑战是,我的代码中有一个关键(但快速)部分

1-我有一个给定类的对象,该对象有两个
静态
字段。我们把这个叫做A级

2 A公开了一个访问
静态
字段的非静态方法。用于阅读和写作。让我们调用此方法
doJob

3-每个请求实例化类
A
的对象,并调用
doJob

A A=新A();a、 doJob()

4-我假设每个请求都在创建一个新的
线程
,其中执行
doJob

5-如果我将
doJob
定义为
public synchronized void doJob(){//Do the job}
一次只有一个
线程执行该方法,其他线程将继续等待


问题是:我说的对吗?

鉴于您试图用非静态(即每个对象一个)监视器保护静态(即每个类一个)字段,我想说“一次只有一个线程将执行该方法,其他线程将继续等待”的说法不成立。

您是对的,但doJob将在实例级别同步,因此doJob方法可以由两个或多个不同线程在两个或多个A类实例上同时执行。如果您希望doJob一次仅由一个线程执行(例如,因为它更改静态字段)您应该声明它是静态的,或者使用静态字段作为锁定对象来同步整个方法体。

将实例方法标记为
synchronized
与执行

public void myMethod() {
  synchronized(this) {
    ...
  }
}
因此,您只能保证两个线程没有运行同一对象的相同方法。来自另一个对象的相同方法可以同时运行


尝试与更“静态”的对象同步。我会使用类对象本身,或者一些静态(和不可变)成员。

是的,您的大纲是正确的。在其他线程等待访问时,它确实会在技术上造成系统瓶颈。只要您避免在同步块中放入任何繁重的处理或i/o,这是完全正常的。

对象实例与同步无关(某些实例可能仅在上下文X中使用/可见除外)。我认为这有一个Java线索…嗨,阿尔夫,谢谢你的回答。添加一些其他的静态字段,然后在方法synchronized(staticfield){//dothejob}中的某个地方怎么样?谢谢你,这是一种可能的方法。不过,一般来说,人们希望从目标和保障的角度来思考,而不是从低级细节的角度来思考;因为我们不知道你的目标,所以我不能说这是否是一个好的方法。我想我明白你说的了。是否是类中的某个静态字段,名为syn,然后是public void myMethod(){synchronized(syn){…}}非常感谢。