JAVA通过信号量避免死锁

死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞,因此程序不可能正常终止。 

导致死锁的根源在于不适当地运用”synchronized”关键词来管理线程对特定对象的访问。

“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权。当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象上的锁。

嵌套使用锁是死锁最主要的原因的

    public void run() {
        synchronized (obj1) {
            synchronized (obj2) {
            }
        }
    }

如果你已经有一个资源了就要避免封锁另一个资源。如果你运行时只有一个对象封锁,那是几乎不可能出现一个死锁局面的。

public void run() {
        synchronized (obj1) {

        }
        synchronized (obj2) {
        }

    }

这是避免死锁的一种方式,另外还可以使用信号量机制来避免死锁。

Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。

 

    原文作者:konami
    原文地址: http://www.cnblogs.com/akaneblog/p/6814415.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞