1、JVM锁:
都拿到1这张票,用的是for循环,就会出现超卖都情况
3W1h what
synchronize 右图事例。
线程状态:
就绪 等待 运行 结束
javac a.class javap -c
lock:手动进行释放锁
lock.unlock()
tomcat 200-1000
JVM中都有锁,解决不了分布式应用场景中都数据问题
每一个都要一个进行锁都下发。
JVM之间不能给共享数据,也会出现超卖的情况。(数据同时从主存中拉取到工作内存中来,卖出3张结果DB中的票数只减少1张)
分布式锁(JVM的锁进行集中处理)
1.表锁 / 乐观锁/悲观锁
2.
3.Redis(性能更好一些):
资源并发有共享资源(数据一致性)都要锁:秒杀、
2、分布式锁:DB Zookeeper Redis
Redis分布式锁的实现:
setnx:很多人执行setnx
redis :单线程执行,不会出现问题(如果没执行就挂了,没设超时、没有清除等 锁永远不会释放)出现死锁的情况
解决方法:设计过期时间、
锁过期时间,不同的业务所要的时间不同,设计的过期时间也是不固定的。(过期时间问题)
脚本中写的所有命令同时成功或失败。自带原子性
开启一个线程,在业务执行完之前进行监视,看是否需要进行续费,一直加时间,设置最大的加时时间。
lua脚本可以直接写成String字符串实现调用Redis
效率不是很高。
自旋:自己给自己加时间》
Redisssion:
总结: