同步多线程将数字加1,结果各不相同

时间:2018-03-23 23:08:44

标签: java multithreading

我不知道这是否正常工作,但我尝试使用1000个线程向变量添加1。然后我打印出最后的数字以验证它是否有效,它永远不会是1000而且它也会改变。

我确定这可能是谷歌搜索的同步问题,但是当我尝试同步线程时,它仍然不是1000,而且变化但是要少很多(在995到997之间变化,而没有同步它大致在900到1000之间变化。

这是我到目前为止所做的事情:

<div id='printArr'>
    <p class='card-title' style='text-align:center;margin:2px 0 -10px 0;font-size:11px'><strong>$mvalue->product_name</strong></p>
    <div class='card-body text-center'>
        <p class='card-title chead' style='text-align:center'>$mvalue->strength &nbsp; &nbsp; &nbsp; $mvalue->form</p>
        <img class='' src='$base/assets/images/barcode/$mvalue->batch_no.png' alt='Card image'>
        <div class='container'>
            <p style='text-align:center;margin:3px 0 -5px 0;font-size:10px'>EXP:$mvalue->expire_date</p>
        </div>
    </div>
</div>


@media print{
    #printArr {
    width: 1.5in;
    height: 1.0in;
    box-shadow: none !IMPORTANT;
    border-radius: 0 !IMPORTANT;
    margin: 0;
}
.chead{
    font-size: 9px !IMPORTANT;
    margin-bottom: 2px;
}
#printArr img {
    max-width: 100%;
    text-align: center;
    max-height: .8in
}    
}
#printArr img {
   max-width: 100%;
   text-align: center;
}

我的问题是这些线程应该按照我写的方式同步吗?如果它们被同步,为什么它们在技术上是安全的,会产生不同的结果?

1 个答案:

答案 0 :(得分:1)

System.out.println("----- " + adder.count); - 您访问countsynchronizeadder,因此不安全(也不是你等待工人完成,join()如果你希望在打印总数之前看到最终总数,或者添加另一个循环来等待)。此外,在实际代码中,您 应该 使用AtomicInteger