Java中的锁

1、怎么保证线程安全?

可以在方法上加锁;也可以将线程使用的成员变量放到ThreadLocal中。

2、加什么锁  

synchronized或者ReentrantLock,ReentrantLock是Lock接口的一个实现类。

3、ReentrantLock是公平锁还是非公平锁

默认是非公平锁,但是可以改为公平锁,就是在创建对象时传一个true的参数。
非公平锁就是线程通过抢锁的方式进入方法,所以是随机的;而公平锁是按先后顺序进入的。

4、synchronized怎么用

可以加到方法上,也可以加在方法体中。
加在方法上就是加在返回类型的前面,比如public synchronized void 方法名();
加在方法体中,就需要用和定义方法差不多的格式,如:
synchronized(锁的对象) {--需要锁上的代码--},小括号里的参数可以是方法里传过来的参数。
注意如果参数是Long类型,则需将它转为String类型在调用一下intern()方法。原因是Long类型参数只能保证-128到127之间使用的是一个对象,也就是同一个地址,不在这个范围内的每次传过来都会解析为不同的对象,从而导致加锁失败。
使用intern()方法也是同样的道理,它可以保证传过来的相同字符串使用的是同一个地址。

5、加在方法体中锁的是什么?

锁的就是传过来的参数。

6、锁定的参数是什么数据类型的?

一般是Long类型和String类型。

7、能锁住吗

必须使用String的intern()方法才能锁住。

8、集群情况下synchronized管用吗?

不管用了,因为synchronized只能锁住本服务器上的线程,对于其他服务器的请求是锁不住的。
举例说明:现在一个商品的库存为1,假设有3台服务器且它们用锁的都是synchronized,那么现在有100个请求同时打到3台服务器中,那么库存就会变为-2,因为每台服务器的第一个请求都是可以进入方法的而且几乎是同时间进入,第一个请求进入后才会将方法锁上。

9、那怎么办?

使用分布式锁。

10、怎么实现的分布式锁?

核心原理用到的是Redis的setNx命令
而我们可以直接使用Redisson,它是封装了Redis的setNx命令的一种框架。

11、看门狗机制

我们在使用分布式锁时一般都会设置一个时间,看门狗机制就是当方法的执行时间超过我们设置的时间时会自动为锁时间续期,来保证执行方法时一直有锁的保护。

12、红锁

红锁是一种概念,它是指Redis集群下,设置分布式锁时至少有一半的Redis节点都接收到才算上锁成功。

13、Redisson的实现原理

这个我只知道是用setNx+LUA脚本实现的,但原理了解不深。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值