0
例一:为什么这个线程是不是安全
public class Test {
public static void main(String[] args) {
ExecutorService pool = Executors.newFixedThreadPool(2);
Runnable t1 = new MyRunnable("A", 2000);
Runnable t2 = new MyRunnable("B", 3600);
Runnable t3 = new MyRunnable("C", 2700);
Runnable t4 = new MyRunnable("D", 600);
Runnable t5 = new MyRunnable("E", 1300);
Runnable t6 = new MyRunnable("F", 800);
pool.execute(t1);
pool.execute(t2);
pool.execute(t3);
pool.execute(t4);
pool.execute(t5);
pool.execute(t6);
pool.shutdown();
}
}
class MyRunnable implements Runnable {
private static AtomicLong aLong = new AtomicLong(10000);
private String name;
private int x;
MyRunnable(String name, int x) {
this.name = name;
this.x = x;
}
public void run() {
System.out.println(name + " excute" + x + ",money:" + aLong.addAndGet(x));
}
}
这个线程不是此示例中的安全。
例二
public class CountingFactorizer implements Servlet {
private final AtomicLong count = new AtomicLong(0);
public void service(ServletRequest req, ServletResponse resp) {
count.incrementAndGet();
}
}
这是为什么线程安全的?有人可以告诉我?
我在java学习线程,但不能理解两个样本。他们不一样吗?
你为什么认为例子1不是线程安全的? – dkatzel
@dkatzel,你可以在eclipse中运行它,大部分时间都是正确的。 **但是**有时候不安全。 – william
不安全如何?只是因为它以不同的顺序执行并不意味着它不是线程安全 – dkatzel