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脚本实现的,但原理了解不深。
170万+

被折叠的 条评论
为什么被折叠?



