我有一个值为0
的volatile变量,我希望使用5个线程将其增加到100
。我正在尝试从0
到100
生成结果而没有重复。任何人都可以帮我解决这个问题。
我尝试这种方法。这是对的吗?
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();
}
}
答案 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();
对于单个变量,它是无锁且线程安全的。