当前位置: 主页 > JAVA语言

java如何避免死锁-避免Java死锁,合理使用synchronized关键字

发布时间:2023-06-21 07:03   浏览次数:次   作者:佚名

java如何避免死锁?通过合理使用synchronized关键字解决的死锁和不使用synchronized导致的死锁。

java如何避免死锁_银行家算法避免死锁_java避免死锁

一、死锁java语言中,在锁语言中,所有对象都有一个java_lock_pointer(java_lock_pointer)指针标记这个对象自己的锁:当对象上有一个synchronized实例方法时,对象锁就由java_lock_pointer指向这个java_lock_pointer,如果自己被重写时java_lock_pointer将与方法同时获得锁。

银行家算法避免死锁_java避免死锁_java如何避免死锁

另外在java对象分配内存时不使用synchronized也可以防止死锁java如何避免死锁,代码如下:假设我们有一个线程a在执行getlastone方法(其默认的锁是方法上的get,锁的lock已保证只在本方法中有效),但是线程a执行完getlastone方法后才发现,程序并没有释放原本应该分配给线程a的锁,在这种情况下如果加锁,可能会导致线程a被反锁,失去对应的执行权。

java避免死锁_java如何避免死锁_银行家算法避免死锁

这时我们可以创建一个线程b,在这个线程b执行getlastone方法前检查锁,如果锁还没有被释放则将锁再次分配给线程b,而锁的关键字java_lock_pointer并不是让锁和锁之间有联系,而是将锁放在内存块中形成等待块,在进行getlastone操作之前先检查锁,并且把锁释放,这样就保证了在获取锁时,锁只和线程a有关。

java避免死锁_银行家算法避免死锁_java如何避免死锁

二、不使用synchronized如果不是java对象,而是普通对象且没有在这里标记指向锁对象的java_lock_pointer,在java语言中getlastone是不会等待的,这时即使线程没有获取到锁对象的锁,依然能通过synchronized可以执行锁操作:staticsynchronizedvoidgetlastone(){//因为线程a执行getlastone时不锁定锁java如何避免死锁,所以可以让线程b继续执行同步代码,这一步在java代码中叫做“getlastone”锁同步代码。for(inti=0;i