java - 为什么此代码中没有发生同步?

标签 java multithreading synchronization

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/

相关文章:

macos - 在 OS X 中设置文件时间戳的 API

java - DynamoDB 的映射器是否支持查询自动生成的 key ?

java - 如何将 'string-array' 从 XML 转换为 Java 中的字符串数组?

synchronization - 错误: BFS on CUDA Synchronization

c++ - 用于线程间通信的 Windows 套接字

multithreading - Metal - 线程和线程组

c - 同步所有事件线程C并一一释放?

java - ClassCastException 与 JAXB - Websphere jar 与 applicationl jar

java - 如何搭建仿真架构,OO设计

ios - GCD -dispatch_async 在主队列上工作,但在后台队列上崩溃