示例一:
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学习线程,但无法理解两个样本。它们不同吗?答案 0 :(得分:1)
到目前为止,我可以看到两者都是线程安全的。在这两个示例中,静态类级别成员是AtomicLong
,根据定义是线程安全的。第一个示例中的所有其他成员都是实例级成员,并且在不同的线程中执行,因此根本没有冲突。