多线程学习总结(八)——线程安全之“”锁“”
2016-10-07 11:50
204 查看
声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我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群里联系我。
相关文章推荐
- 多线程学习总结(九)——线程安全之线程间的通信
- 多线程学习总结(七)——线程安全之共享变量
- 多线程学习总结(十一)——线程安全之线程间的通信notify和notifyAll
- 多线程学习总结(十)——线程安全之线程间的通信深入
- 关于多线程学习总结(二) 了解线程的属性及方法
- JAVA多线程与并发学习总结
- Win32 多线程学习总结
- java多线程学习总结之二:线程状态的转换
- 黑马程序员_多线程学习总结(四)
- 黑马程序员学习log第四篇基础知识:JAVA的面向对象之多线程总结
- 多线程学习总结(十二)——构建简单的线程池
- Java多线程学习总结(二)
- 学习python多线程的简单总结
- java多线程学习总结(一)
- 多线程学习总结(一)——认识多线程
- java 多线程学习总结
- [黑马程序员]多线程学习总结
- Linux多线程学习总结
- Java多线程学习与总结(Join)
- Java多线程基础学习之线程的创建方式总结