1.什么是锁?
从我们日常生活中看,每个门都配一把锁,也就是说是门一般都有一把锁,如果没有锁,问题就来了,什么样的人都可以进去,也就是产生了不安全的因素。从这里引出了锁........
当一个人进去以后,把门锁住,其他的人进不来,等这个人办完事之后,再把锁打开,接着第二个人进入,这就是锁安全。
如下是线程中进入函数的案例(加锁操作):
2.在我们程序中有几种锁?
1.类锁 2.对象锁 3.显示锁
(1)类锁:以单例模式进行举例:
因为会引发new 两次的现象,就加一个锁(synchroized):
进而演变成如下单例模式------》
在这里说明一下,很多开发者都说 synchronized 是 隐士锁,因为synchronized 的解锁和锁定的操作是内部自己帮我们完成好了,我们看不见,所以叫隐士锁,还有一种说法是悲观锁。因为它认为肯定会发生问题,我就等着,要不别人等着。也是一个内置锁。在这个片段中,Manager.class对象持有了一把锁(类锁)。
(2)对象锁(计数):
进行打印后会发现不会有两万次,也就是一直是少于2000次,原因是有的线程进入会出现重复加一次的问题,也是线程不安全的问题。上述累加函数改成:
因为这个锁是加载不带static的函数上,所以是对象锁,等价于:
this:代表指代这个对象上持有的这把锁:对象锁。
(3).显示锁:顾名思义:加锁操作和解锁操作是由我们进行操作。
将上面例子累加操作改为如下代码
注:这里有一个可重入锁的概念:
synchronized : 天生是一个可重入锁,比如一个递归操作,第一次进去拿到锁,随后执行完毕,紧接着又调用该函数,又重复拿到锁。
可重入锁就是在递归的时候可以重复拿到锁,(我暂时是这样理解的)