Java线程安全和非线程安全 (三)

2014-11-24 11:10:33 · 作者: · 浏览: 2
r, CountDownLatch countDownLatch)
{
this.counter = counter;
this.countDownLatch = countDownLatch;
}

public void run()
{
// 每个线程向Counter中进行10000次累加
for(int i = 0; i < 10000; i++)
{
counter.addCount();
}

// 完成一个子线程
countDownLatch.countDown();
}
}

class Counter
{
private int count = 0;

public int getCount()
{
return count;
}

public void addCount()
{
count++;
}
}

上面的测试代码中,开启1000个线程,每个线程对计数器进行10000次累加,最终输出结果应该是10000000。

但是上面代码中的Counter未进行同步控制,所以非线程安全。

输出结果:

9963727

9973178

9999577

9987650

9988734

9988665

9987820

9990847

9992305

9972233

稍加修改,把Counter改成线程安全的计数器:

[java]
class Counter
{
private int count = 0;

public int getCount()
{
return count;
}

public synchronized void addCount()
{
count++;
}
}

class Counter
{
private int count = 0;

public int getCount()
{
return count;
}

public synchronized void addCount()
{
count++;
}
}


上面只是在addCount()方法中加上了synchronized同步控制,就成为一个线程安全的计数器了。再执行程序。

输出结果:

10000000

10000000

10000000

10000000

10000000

10000000

10000000

10000000

10000000

10000000