Java 创建1000个线程以更改变量值

Java 创建1000个线程以更改变量值,java,multithreading,synchronization,thread-synchronization,Java,Multithreading,Synchronization,Thread Synchronization,我创建了一个程序,它创建1000个线程,每个线程向一个变量和中添加1。 我的问题是我得到的输出只有1s 节目如下: class Threading implements Runnable{ T6_Q1 sumObject=new T6_Q1(); Thread t; Threading(){ t=new Thread(this); t.start(); } @Override public void run(

我创建了一个程序,它创建1000个线程,每个线程向一个变量和中添加1。 我的问题是我得到的输出只有1s

节目如下:

class Threading implements Runnable{

    T6_Q1 sumObject=new T6_Q1();

    Thread t;

    Threading(){
        t=new Thread(this);
        t.start();
    }

    @Override
    public void run() {

        setSumValue();

        System.out.println(sumObject.getSum());   
    }


   public void setSumValue(){
        Integer value=sumObject.getSum().intValue()+1;

        sumObject.setSum(value);

    }
}

public class T6_Q1
{


Integer sum =new Integer(0);

public void setSum(int value){
   this.sum=new Integer(value);
}

//method to get the sum value
public Integer getSum(){
    return this.sum;
}

public static void main(String[] args) {

   //launches 1000 threads
    for(int i=1;i<=1000;i++)
    {
    new Threading();
    }

}
}
类线程实现可运行{
T6_Q1 sumObject=新T6_Q1();
螺纹t;
线程(){
t=新螺纹(本螺纹);
t、 start();
}
@凌驾
公开募捐{
setSumValue();
System.out.println(sumObject.getSum());
}
public void setSumValue(){
整数值=sumObject.getSum().intValue()+1;
sumObject.setSum(值);
}
}
公共类T6_Q1
{
整数和=新整数(0);
公共无效设置总和(整数值){
此.sum=新整数(值);
}
//方法来获取和值
公共整数getSum(){
返回此.sum;
}
公共静态void main(字符串[]args){
//启动1000个线程

对于(int i=1;i每个
线程化
对象都有自己的
sumObject
实例和自己的值。
他们之间没有任何关系

一旦解决了这个问题,您将发现您的代码是完全非线程安全的。

在1000个不同的对象上同步根本不能解决这个问题;在单个对象上同步将完全破坏线程的目的。

除了“破坏目的”之外,我完全同意这显然是一个极小的例子,在更广泛的上下文中,线程安全的版本将是很有意义的。@ MakOtOrdoNik:不,<代码> AtomicInteger < /C>。这是java Pro技巧,只有当这个例子是字面上的时候才起作用。也许比仅仅改变一个变量的工作更多。e在高负载下比CAS更高效。您是对的,我无法仅通过向方法中添加同步来同步所有1000个对象。如何同步对象以获得从1到1000打印的值?我也尝试在setSumValue方法中使用synchronized(sumObject),但不起作用。再次感谢:)@Marko在高负载下,锁怎么能比CAS更有效?基本上:如果没有某种原子指令,你怎么实现一个锁?