package atask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Q3Synchronization
{
Integer sum=new Integer(0);
Q3Synchronization(){
ExecutorService e=Executors.newFixedThreadPool(1000);
for(int i=0;i<1000;i++){
e.execute(new Sum());
}
e.shutdown();
while(!e.isTerminated()){
}
System.out.println(sum);
}
public static void main(String[]args){
new Q3Synchronization();
}
class Sum implements Runnable{
@Override
public void run() {
m();
}
public synchronized void m(){
sum=sum+1;
}
}
}
问题是:
- (同步线程)编写一个启动 1,000 个线程的程序。每个线程将 1 添加到最初为 0 的变量 sum 中。您需要通过引用将 sum 传递给每个线程。为了通过引用传递它,请定义一个 Integer 包装对象来保存 sum。在同步和不同步的情况下运行该程序,看看其效果。
最佳答案
简而言之
对象方法同步/锁定在每个实例的基础上工作。
说明
您正在创建 Sum
类的 1000 个实例。对 m()
的每次调用都是同步的,但不会导致任何其他线程等待。这是因为没有对同一实例的并发调用,而是对不同实例的调用。我附上了您的代码,做了一些小小的更改:
Sum s = new Sum();
for(int i=0;i<1000;i++){
e.execute(s);
}
如果您尝试进行此更改,计数器变量中将始终得到 1000
的结果。
关于java - 为什么此代码中没有发生同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30499096/