b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

多线程死锁是如此简单(2)

电脑杂谈  发布时间:2020-05-02 11:18:27  来源:网络整理

我们可以像这样转换它:


class CooperatingNoDeadlock {
    @ThreadSafe
    class Taxi {
        @GuardedBy(this) private Point location, destination;
        private final Dispatcher dispatcher;
        public Taxi(Dispatcher dispatcher) {
            this.dispatcher = dispatcher;
        }
        public synchronized Point getLocation() {
            return location;
        }
        public synchronized void setLocation(Point location) {
            boolean reachedDestination;
            // 加Taxi内置锁
            synchronized (this) {
                this.location = location;
                reachedDestination = location.equals(destination);
            }
            // 执行同步代码块后完毕,释放锁

            if (reachedDestination)
                // 加Dispatcher内置锁
                dispatcher.notifyAvailable(this);
        }
        public synchronized Point getDestination() {
            return destination;
        }
        public synchronized void setDestination(Point destination) {
            this.destination = destination;
        }
    }
    @ThreadSafe
    class Dispatcher {
        @GuardedBy(this) private final Set<Taxi> taxis;
        @GuardedBy(this) private final Set<Taxi> availableTaxis;
        public Dispatcher() {
            taxis = new HashSet<Taxi>();
            availableTaxis = new HashSet<Taxi>();
        }
        public synchronized void notifyAvailable(Taxi taxi) {
            availableTaxis.add(taxi);
        }
        public Image getImage() {
            Set<Taxi> copy;
            // Dispatcher内置锁
            synchronized (this) {
                copy = new HashSet<Taxi>(taxis);
            }
            // 执行同步代码块后完毕,释放锁

            Image image = new Image();
            for (Taxi t : copy)
                // 加Taix内置锁
                image.drawMarker(t.getLocation());
            return image;
        }
    }
    class Image {
        public void drawMarker(Point p) {
        }
    }
}

使用公开通话是一种非常好的方法,您应该尝试使用它〜

使用显式Lock锁,获取锁时使用tryLock()方法. 当等待时间超过时间限制时,tryLock()不会永远等待多线程如何避免死锁,而是返回错误消息.

使用tryLock()可以有效避免死锁问题~~

解决线程死锁_避免死锁_多线程如何避免死锁

尽管死锁的原因是我们设计得不好,但在编写代码时我们可能不知道死锁发生在什么地方.

JDK提供了两种测试方法:

具体参考:

造成僵局的主要原因是:

在执行方法时,您需要按住锁,并且不要释放永久等待状态

在操作系统级别查看死锁问题(这是我之前做的注释,非常简单):

参考:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-196408-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...