声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我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群里联系我。