[英]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.