使用原子类或synchronized(没用Lock)解决阐述多线程所遇到线程安全问题和解决方案...

例子题目:

创建10个线程,每个线程执行10000次加1,输出总和

正常结果100000  但是如果出现线程不安全会低于100000

import java.util.concurrent.CountDownLatch;

/**
 * 解决多线程并发遇到的问题 例如:线程安全 主线程等待子线程处理完在执行
 *
 * @author wangbing
 * @since 17 七月 2018
 */
public class TreadSafe {

    //原子操作类
    //static volatile AtomicInteger count = new AtomicInteger(0);
    static int count = 0;
    static Object common = new Object();
    //定义CountDownLatch
    static CountDownLatch countDownLatch = new CountDownLatch(10);

    public static void main(String[] args) throws InterruptedException {

        Task task = new Task();//这句代码位置很重要 这是实例一次
        // 下面创建10个线程 参数为同一个实例即上面,因同一个实例(即多个线程共享一个锁)
        // 所以在实例的run上加synchronized可以保证线程安全
        for (int i = 0; i < 10; i++) {
            //Task task = new Task(); //若实例位置在这里,那么每次创建新实例并传入到新线程中,
            //导致10个线程的参数并非同一实例而是10个不同的实例,那么实例run上加synchronized就无效了,
            //因为锁绑定了10个线程,共10个锁,并没有共享一个锁。 但若想实现同步可以锁住一个共享对象如run中注释掉部分
            Thread thread = new Thread(task);
            thread.start();

        }
        countDownLatch.await();
        System.out.println(" 等待子线程结束结果为: " + count);

    }

    static class Task implements Runnable {
        @Override
        public synchronized void run() {

            for (int i = 0; i < 10000; i++) {
                // count.addAndGet(1); //原子加1
                /*synchronized (common) {
                    count++;  //锁住common即锁住多个线程共享唯一的对象,这就可以实现线程安全,解决上面实例位置的不同导致锁错对象
                }*/
                count++;
            }
            countDownLatch.countDown();
        }
    }
}

注释上面写了 解决方案!!

转载于:https://www.cnblogs.com/caiba/p/9325633.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值