0

我有一个使用我编写的一些罐子的网络应用程序。我的挑战是我的代码中有一个关键(但速度很快)的部分。

1 - 我有一个给定类的对象,它有几个static字段。我们称这个类为A

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

3 - 每个请求都实例化一个类的对象A并调用doJob.
A a = new A(); a.doJob();

4 - 我假设每个请求都在创建一个新ThreaddoJob执行位置。

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

问题是:我说的都对吗?

4

4 回答 4

1

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

于 2012-05-30T22:32:43.963 回答
0

鉴于您正在尝试使用非静态(即每个对象一个)监视器保护静态(即每个类一个)字段,我会说“一次只有一个线程将执行该方法,而其他线程将保持等待”的主张不成立。

于 2012-05-30T22:32:26.640 回答
0

不。

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

public void myMethod() {
  synchronized(this) {
    ...
  }
}

所以,你只能保证两个线程没有运行同一个对象的同一个方法。来自另一个对象的相同方法可以同时运行。

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

于 2012-05-30T22:32:49.077 回答
0

是的,你的大纲是正确的。并且在其他线程等待访问时,它确实在技术上成为系统瓶颈。只要您避免在同步块中放置任何繁重的处理或 i/o,这是非常好的和正常的。

于 2012-05-30T22:45:26.043 回答