目的:创建4个线程,在每个线程中for循环将1个共享int变量添加1万次。最后,共享变量预计为40000.我使用两种方式来做到这一点,每次我运行代码时,结果并不总是40000.我不知道什么是错的。使用java多线程计数,似乎不工作
方法1同步:
public class bbb {
int i=0;
public void add() {
synchronized(bbb.class){
i++;
bbb.class.notifyAll();
System.out.println(i);
try {
bbb.class.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread t1=new Thread(new Runnable() {
bbb b=new bbb();
@Override
public void run() {
// TODO Auto-generated method stub
int i=0;
for (; i < 10000; i++) {
b.add();
}
}
},"A");
Thread t2=new Thread(t1,"B");
Thread t3=new Thread(t1,"C");
Thread t4=new Thread(t1,"D");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
方法2乐观锁:
static volatile int value=0;
static void optimisticLock(int expected,int update){
if(expected==value){
value=update;
System.out.println(Thread.currentThread().getName()+" "+update);
}else{
optimisticLock(value, value+1);
}
}
public static void main(String[] args) {
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<10000;i++){
optimisticLock(value, value+1);
}
}
},"A");
Thread t2=new Thread(t1,"B");
Thread t3=new Thread(t1,"C");
Thread t4=new Thread(t1,"D");
t1.start();
t2.start();
t3.start();
t4.start();
}
结果是39996? –
为什么你需要在那里等待和通知?不明白 – developer
我运行了程序,当java进程达到39950+数时卡住java进程,可能存在某种死锁。不知道你要怎么处理这么多的并发症。这可以做得更简单一点。 – Zeus