如何使用多线程增加java中的volatile int?

时间:2016-02-20 05:02:39

标签: java multithreading synchronized volatile

我有一个值为0的volatile变量,我希望使用5个线程将​​其增加到100。我正在尝试从0100生成结果而没有重复。任何人都可以帮我解决这个问题。

我尝试这种方法。这是对的吗?

public class Producer implements Runnable {
    VolatileIncrement vo = null;
    String str = null;
    Producer(VolatileIncrement vo, String str){
        this.vo = vo;
        this.str = str;
    }

    @Override
    public void run() {
        while(vo.i < 100){
            System.out.println(str+vo.increaseI());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }   
    }
}

public class VolatileIncrement {    
    volatile Integer i = 0;
    public synchronized int increaseI() {
            i++;
            return i;
        }
    }
}

public class ProducerMain {
    public static void main(String[] args) {
        VolatileIncrement vo = new VolatileIncrement();
        Producer p1 = new Producer(vo,"I am thread 1 - ");
        new Thread(p1).start();
        Producer p2 = new Producer(vo,"I am thread 2 - ");
        new Thread(p2).start();
        Producer p3 = new Producer(vo,"I am thread 3 - ");
        new Thread(p3).start();
        Producer p4 = new Producer(vo,"I am thread 4 - ");
        new Thread(p4).start();
        Producer p5 = new Producer(vo,"I am thread 5 - ");
        new Thread(p5).start();
    }
}

3 个答案:

答案 0 :(得分:0)

int counter=0;
public static synchronized void increase()
{
     counter++;
}

调用此方法..由于它声明为synchronized,因此一次只能运行一个线程(即一次增加)。

答案 1 :(得分:0)

a)如果对该变量的所有访问都在同步块内,则没有理由使用volatile。对于在线程之间同步内存,Synchronized具有比volatile更大的范围。

b)你不能制作一个简单的i ++原子;您需要同步,或重入锁,或所述AtomicInteger。

答案 2 :(得分:0)

您可以使用原子1类通过多线程更新整数

AtomicLong counter = new AtomicLong(0);
counter.getAndIncrement();

对于单个变量,它是无锁且线程安全的。