繁体   English   中英

Java线程和同步

[英]Java Threads and synchronization

我有一个网络应用程序,它使用了我编写的一些jar。 我的挑战是我的代码中有一个关键(但很快)的部分。

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

2 _ A公开了访问static字段的非静态方法。 阅读和写作。 让我们将此方法doJob

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

4-我假设每个请求都在执行doJob地方创建一个新Thread

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

问题是:我在说什么好吗?

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

鉴于您正在尝试使用非静态(即每个对象一个)监视器来保护静态(即每个类一个)字段,我想说“一次仅一个线程将执行该方法,而其他线程将继续执行该方法。等待”声明不成立。

没有。

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

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

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

尝试与更多“静态”对象进行同步。 我将使用类对象本身,或某些静态(且不可变)的成员。

是的,您的概述是正确的。 从技术上讲,它确实使系统成为瓶颈,而其他线程等待访问。 只要您避免在同步块中进行任何繁重的处理或I / O,这就完全正常了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM