线程安全的实现
线程安全是通过线程同步控制来实现的,也就是synchronized关键字。
在这里,我用代码分别实现了一个非线程安全的计数器和线程安全的计数器Counter,并对他们分别进行了多线程测试。
非线程安全的计数器:
[java]view plaincopy

publicclassMain
{
publicstaticvoidmain(String[]args)
{
//进行10次测试
for(inti=0;i<10;i++)
{
test();
}
}
publicstaticvoidtest()
{
//计数器
Countercounter=newCounter();
//线程数量(1000)
intthreadCount=1000;
//用来让主线程等待threadCount个子线程执行完毕
CountDownLatchcountDownLatch=newCountDownLatch(threadCount);
//启动threadCount个子线程
for(inti=0;i<threadCount;i++)
{
Threadthread=newThread(newMyThread(counter,countDownLatch));
thread.start();
}
try
{
//主线程等待所有子线程执行完成,再向下执行
countDownLatch.await();
}
catch(InterruptedExceptione)
{
e.printStackTrace();
}
//计数器的值
System.out.println(counter.getCount());
}
}
classMyThreadimplementsRunnable
{
privateCountercounter;
privateCountDownLatchcountDownLatch;
publicMyThread(Countercounter,CountDownLatchcountDownLatch)
{
this.counter=counter;
this.countDownLatch=countDownLatch;
}
publicvoidrun()
{
//每个线程向Counter中进行10000次累加
for(inti=0;i<10000;i++)
{

counter.addCount();
}
//完成一个子线程
countDownLatch.countDown();
}
}
classCounter
{
privateintcount=0;
publicintgetCount()
{
returncount;
}
publicvoidaddCount()
{
count++;
}
}
上面的测试代码中,开启1000个线程,每个线程对计数器进行10000次累加,最终输出结果应该是10000000。
但是上面代码中的Counter未进行同步控制,所以非线程安全。
输出结果:
9963727
9973178
9999577
9987650
9988734
9988665
9987820
9990847
9992305
9972233
稍加修改,把Counter改成线程安全的计数器:
[java]view plaincopy
classCounter
{
privateintcount=0;
publicintgetCount()
{
returncount;
}
publicsynchronizedvoidaddCount()
{
count++;
}
}
上面只是在addCount()方法中加上了synchronized同步控制,就成为一个线程安全的计数器了。再执行程序。
输出结果:
10000000
10000000
10000000
10000000
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-40171-2.html
中国传统道德的悲哀