一个线程读取,另一个线程写入共享变量


在这种情况下

是否存在竞争条件:当然,当一个线程读取而另一个线程以不同的方法写入时。我是多线程和并发的初学者

class counter {
int count = 0;
void increment() {
    count++;
}
int read() {
    return count;
}
}
class voltest {
public static void main(String[] args) {
    final counter c = new counter();
    Runnable r1 = new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            c.increment();
        }
    };
    Runnable r2 = new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            c.read();
        }
    };
    Thread t1 = new Thread(r1);
    Thread t2 = new Thread(r2);
    t1.start();
    t2.start();
}
}

是的,有一个竞争条件。像count++这样的表达式不是原子的 - 它们被归类为读取-修改-写入表达式,另一个线程可以随时访问该变量。

看看这个关于Java原子的链接,它实际上讨论了使用增量运算符。

最新更新