大家好,今天小编关注到一个比较有意思的话题,就是关于java语言锁的问题,于是小编就整理了5个相关介绍Java语言锁的解答,让我们一起看看吧。
J***a语言如何正确实现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
j***a线程锁为什么锁不住?
代码没发全。但是还是可以猜一下,我猜account是这个类的一个普通成员变量。你new了三个这个类的instance,所以在内存里有三个account被三个thread操作,即使你sync这个类的class,也不会起作用。两个基本解决方案:1,把account声明成static。 2,把这个类从继承thread变成实现runnable,在main方法里只new一个这个类的实例,并发的thred都用这一个实例。
还有很多J***a的独有的办法解决这个问题,例如: 用atomicinteger来做account,就不需要sync了
题主没有给出完整代码和运行结果,我分析这段代码是没有问题的,可以正确运行。
这段代码里,使用了S***eMoney类对象的锁,这个对象在运行时有且只有一个实例,这就保证了这段代码在执行时,同时只能有一个线程获得锁,其他的线程都要等待锁持有线程释放锁之后才能进入。所以题主需要补充一下,锁不住这个结论时怎么得出的。
我还原了这段代码,并给出运行结果如下:
运行代码,应该与题主的一致
运行结果表明,三个线程互斥执行同步代码块。
欢迎大家批评指正,如果觉得楼主答得不错,请点赞和关注^v^
如何理解J***a锁的可重入性?
可重入锁 ReentrantLock:支持重复进入的锁,它表示该锁能够支持一个线程对***的重复加锁。
sychnronized关键字隐式的支持重进入,比如一个sychnronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次地获取该锁。
ReentrantLock虽然没能像sychnronized关键字一样隐式的重进入,但是在调用lock()方法时,已经获取到锁的线程,能够再次调用lock()方法获取锁而不被阻塞。
synchronized标记的同步是要绑定一个对象的,不写的话实际上实际上就是synchronized(this),即绑定当前对象,这个this对象就是锁(synchronized中可以认为就是监视器),当LoggingWidget执行dosomething的时候获得了这把锁(this),那么他去调用父类(Widget)的dosomthing的时候,父类的dosomething方法也要得到这个锁(this),但是子类的这个方法还没有运行完毕,所以还持有这个锁,父类方法在等,子类不释放锁还拼命的让父类方法执行,却不知道父类方法在眼巴巴的等着这个锁,这样就死锁了······
j***a源码中为什么这个参数要加同步锁?
先来说手charSequence,它是j***a语言中一个抽象字符序列的接口,它定义了一组基本的字符数组操作,很多相关的类都实现了这个接口。
我们经常使用的String,StringBuilder,StringBuffer类都实现了这个接口。
String和StringBuffer、StringBuilder都使用一个char数组来储存字符串,所以在进行字符串内容比较时,可以直接使用字符数组来进行比较,效率会比调用CharSequence接口的charAt方法高,因此这里对StringBuffer和StringBuilder做了针对性的处理。
不同之处在于,String是不可变的,而StringBuffer和StringBuilder类是可变对象,其中StringBuffer还是线程安全对象,它在比较过程中可能被多个线程并发修改,为了在字符串比较过程中,避免被其他线程修改,需要进行加锁。
go语言公平锁和非公平锁区别?
在J***a中,synchronized就是非公平锁,它无法保证等待的线程获取锁的顺序。 关于非公平锁 非公平锁即无法保证锁的获取是按照请求锁的顺序进行的。这样就可能导致某个或者一些线程永远获取不到锁。
到此,以上就是小编对于J***a语言锁的问题就介绍到这了,希望介绍关于J***a语言锁的5点解答对大家有用。