大家好,今天小编关注到一个比较有意思的话题,就是关于java语言锁的问题,于是小编就整理了2个相关介绍Java语言锁的解答,让我们一起看看吧。
Java语言如何正确实现Redis分布式锁?
和大家分享我的经验,如何用redis提供的一个简单接口,轻松实现redis分布式锁。
在开始之前,我先简单介绍下redis的性能。
Redis本身是单线程的,这样带来的好处是能够提高读写效率。多线程通常来说会有上下文切换带来的时间损耗,而redis通过绑定单个CPU到某块内存,实现了上下文切换的最小开销,因此这种场景反而比多线程还要高效。
但是,如果有不同的节点同时要对Redis中的同一个数据进行操作,由于是来自不同Redis服务器,就会发生线程不安全的情况。
举例有两个功能函数X和Y(也可以看做是两个服务器节点),二者功能相同,都要执行读取Redis中变量P,并且对其加一的操作。如果是线程安全的,那么X和Y分别执行完之后,P的值应该比原来增加2,但是由于函数XY互相独立,那就可能发生下面这种情况:
1 X读取P
2 Y读取P
3 X将P+1写回Redis
4 Y将P+1写回Redis
java线程锁为什么锁不住?
代码没发全。但是还是可以猜一下,我猜account是这个类的一个普通成员变量。你new了三个这个类的instance,所以在内存里有三个account被三个thread操作,即使你sync这个类的class,也不会起作用。两个基本解决方案:1,把account声明成static。 2,把这个类从继承thread变成实现runnable,在main方法里只new一个这个类的实例,并发的thred都用这一个实例。
还有很多Java的独有的办法解决这个问题,例如: 用atomicinteger来做account,就不需要sync了
题主没有给出完整代码和运行结果,我分析这段代码是没有问题的,可以正确运行。
这段代码里,使用了SaveMoney类对象的锁,这个对象在运行时有且只有一个实例,这就保证了这段代码在执行时,同时只能有一个线程获得锁,其他的线程都要等待锁持有线程释放锁之后才能进入。所以题主需要补充一下,锁不住这个结论时怎么得出的。
我还原了这段代码,并给出运行结果如下:
运行代码,应该与题主的一致
运行结果表明,三个线程互斥执行同步代码块。
欢迎大家批评指正,如果觉得楼主答得不错,请点赞和关注^v^
到此,以上就是小编对于Java语言锁的问题就介绍到这了,希望介绍关于Java语言锁的2点解答对大家有用。