为什么这个帖子不安全

时间:2015-10-14 06:01:33

标签: java multithreading

示例一

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 个答案:

答案 0 :(得分:1)

到目前为止,我可以看到两者都是线程安全的。在这两个示例中,静态类级别成员是AtomicLong,根据定义是线程安全的。第一个示例中的所有其他成员都是实例级成员,并且在不同的线程中执行,因此根本没有冲突。