b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

非线程安全 脏读_线程安全的单例模式_线程安全和线程不安全(2)

电脑杂谈  发布时间:2017-04-08 10:15:01  来源:网络整理

线程安全的实现

线程安全是通过线程同步控制来实现的,也就是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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...