大家好,今天小编关注到一个比较有意思的话题,就是关于java语言中 重入锁的问题,于是小编就整理了3个相关介绍Java语言中 重入锁的解答,让我们一起看看吧。
j***a哪个关键字可以对对象加互斥锁?
首先,J***a中synchronized可以实现对对象加互斥锁。
其次,我们来聊一聊synchronized互斥锁的实现原理。J***a机中,synchronized支持的同步方法和同步语句都是使用monitor来实现的。每个对象都与一个monitor相关联,当一个线程执行到一个monitor监视下的代码块中的第一个指令时,该线程必须在引用的对象上获得一个锁,这个锁是monitor实现的。在HotSpot虚拟机中,monitor是由ObjectMonitor实现,使用C++编写实现,具体代码在HotSpot虚拟机源码ObjectMonitor.hpp文件中。
查看源码会发现,主要的属性有_count(记录该线程获取锁的次数)、_recursions(锁的重入次数)、_owner(指向持有ObjectMonitor对象的线程)、_WaitSet(处于wait状态的线程集合)、_EntryList(处于等待锁block状态的线程队列)。
当并发线程执行synchronized修饰的方法或语句块时,先进入_EntryList中,当某个线程获取到对象的monitor后,把monitor对象中的_owner变量设置为当前线程,同时monitor对象中的计数器_count加1,当前线程获取同步锁成功。
当synchronized修饰的方法或语句块中的线程调用wait()方法时,当前线程将释放持有的monitor对象,monitor对象中的_owner变量赋值为null,同时,monitor对象中的_count值减1,然后当前线程进入_WaitSet***中等待被唤醒。
J***a语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。
互斥属性:即每次只能有一个线程占用***。
请求与保持:即已经申请到锁***的线程可以继续申请。在这种情况下,一个线程也可以产生死锁情况,即抱着锁找锁。
不可剥夺:线程已经得到所***,在没有自己主动释放之前,不能被强行剥夺。
循环等待:多个线程形成环路等待,每个线程都在等待相邻线程的锁***。
分布式锁为什么要具备可重入性?
因为我们不能准确的知道锁内业务逻辑的耗时,再加上根据机器当时的状态及各种原因锁内业务逻辑耗时不是一成不变的固定值,所以对锁的过期时间设置不能足够的准确。一旦线程A的锁在逻辑结束之前被Redis过期释放掉了,其他线程就有可能获得锁就如锁内逻辑,此时A的逻辑还没执行结束,那么就存在锁内逻辑同时被两个线程执行,依旧存在线程安全问题。针对可这问题我们需要考虑一下可重入锁。
lock和synchronized区别是什么?
lock和synchronized都是用于实现多线程同步的机制,但它们有一些区别。首先,synchronized是J***a语言提供的关键字,而lock是一个。
其次,synchronized是隐式锁,它在进入同步代码块时自动获取锁,并在退出时释放锁。而lock需要手动获取和释放锁,可以更灵活地控制锁的获取和释放时机。
此外,lock提供了更多的功能,如可重入锁、公平锁、条件变量等,而synchronized只提供了基本的互斥功能。因此,lock比synchronized更加灵活和强大,但使用时需要手动管理锁的获取和释放,需要更多的代码量和注意事项。
到此,以上就是小编对于j***a语言中 重入锁的问题就介绍到这了,希望介绍关于j***a语言中 重入锁的3点解答对大家有用。
标签: 线程 synchronized 对象