2015-10-14 73 views
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学习线程,但不能理解两个样本。他们不一样吗?

+2

你为什么认为例子1不是线程安全的? – dkatzel

+0

@dkatzel,你可以在eclipse中运行它,大部分时间都是正确的。 **但是**有时候不安全。 – william

+3

不安全如何?只是因为它以不同的顺序执行并不意味着它不是线程安全 – dkatzel

回答

1

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

相关问题