程序中的锁

2020-05-25  本文已影响0人  来个Android小哥

1.什么是锁?

从我们日常生活中看,每个门都配一把锁,也就是说是门一般都有一把锁,如果没有锁,问题就来了,什么样的人都可以进去,也就是产生了不安全的因素。从这里引出了锁........

当一个人进去以后,把门锁住,其他的人进不来,等这个人办完事之后,再把锁打开,接着第二个人进入,这就是锁安全。

如下是线程中进入函数的案例(加锁操作):

2.在我们程序中有几种锁?

1.类锁     2.对象锁   3.显示锁

(1)类锁:以单例模式进行举例:

因为会引发new 两次的现象,就加一个锁(synchroized):

进而演变成如下单例模式------》

在这里说明一下,很多开发者都说    synchronized隐士锁,因为synchronized 的解锁和锁定的操作是内部自己帮我们完成好了,我们看不见,所以叫隐士锁,还有一种说法是悲观锁。因为它认为肯定会发生问题,我就等着,要不别人等着。也是一个内置锁。在这个片段中,Manager.class对象持有了一把锁(类锁)。

(2)对象锁(计数):

进行打印后会发现不会有两万次,也就是一直是少于2000次,原因是有的线程进入会出现重复加一次的问题,也是线程不安全的问题。上述累加函数改成:

因为这个锁是加载不带static的函数上,所以是对象锁,等价于:

this:代表指代这个对象上持有的这把锁:对象锁。

(3).显示锁:顾名思义:加锁操作和解锁操作是由我们进行操作。

将上面例子累加操作改为如下代码

注:这里有一个可重入锁的概念

  synchronized : 天生是一个可重入锁,比如一个递归操作,第一次进去拿到锁,随后执行完毕,紧接着又调用该函数,又重复拿到锁。

可重入锁就是在递归的时候可以重复拿到锁,(我暂时是这样理解的)

上一篇下一篇

猜你喜欢

热点阅读