多线程学习总结(八)——线程安全之“”锁“”

    声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我QQ群:425120333

    上一篇提到的共享变量问题因为,可见性以及原子性问题,出现了共享变量的使用错误,这里和大家说下解决办法,就是加锁。
顾名思义,有锁肯定要有钥匙,在java中可以理解为每把锁都只配了一把钥匙,理解加锁的机制我给大家举个例子。有一个上锁的房间,
房间门口放着钥匙(假设进出房间都要用钥匙打开房间门锁),当一个人要进入房间时,必然会把钥匙拿着,开门进入房间,并带上钥匙,然后事情办好了,
用钥匙从里面把门打开,关上门,归还钥匙,在这整个过程中,如果有其他人要进入这个房间,由于门被关上了,而钥匙也被别人拿走了,
那这个人只能是等待前一个人做完事情归还钥匙后才能进入。
    上面说到的房间相当于我们的共享变量,而会出现问题就是因为共享变量没有加锁导致的,加锁有两种办法一种是使用synchronized关键字,一种是通过lock;
    不过加锁是要开销的,而且比不加锁的代码开销大很多,所以除非必要,否则不要随便乱加锁。
    在上一篇中只要将count++;改为
synchronized(ShareDemo.class){
    count++;
}

这样就能保证整个代码运行没有问题了,也能得到结果为50,这里在补充一下,因为在ShareDemo类中,count是静态成员变量,而静态变量是属于
类的,不是属于某个对象的,所以需要对该类的类对象加锁。
接下来看下用lock怎么改进:
首先在ShareDemo中声明一个静态常量lock(声明为静态的原因是为了保证每次new ShareDemo()时能保证是同一个)
private static Lock lock = new ReentrantLock();
让后将将count++;改为

            lock.lock();
            try {
                count++;
            } finally {
                lock.unlock();
            }

上面说的两种方法都能保证共享变量能够没问题的共享,关于另一个实例的改进,其实也是类似,这里就不再说了,有问题可以QQ群里联系我。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值