18、使用代码块解决synchronized方法无限等待的问题

版权声明:版权归 爱装逼的文艺小青年所有 https://blog.csdn.net/toyota_rav4/article/details/85206387

使用同步方法的过程中容易 造成无限期等待的问题,可以使用同步代码块来解决。

package com.demo2;

public class MyObject {
    synchronized public void methodA(){
        System.out.println("methodA begin");
        boolean flag = true;
        while(flag){
        }
        System.out.println("methodA end");
    }
    synchronized public void methodB(){
        System.out.println("methodB begin");
        System.out.println("methodB end");
    }
}
package com.demo2;

public class ThreadA extends Thread {
    private MyObject myObject;

    public ThreadA(MyObject myObject) {
        this.myObject = myObject;
    }

    @Override
    public void run() {
        myObject.methodA();
    }
}
package com.demo2;

public class ThreadB extends Thread {
    private MyObject myObject;

    public ThreadB(MyObject myObject) {
        this.myObject = myObject;
    }

    @Override
    public void run() {
        myObject.methodB();
    }
}
package com.demo2;

public class Run {
    public static void main(String[] args) {
        MyObject myObject = new MyObject();
        ThreadA threadA = new ThreadA(myObject);
        ThreadB threadB = new ThreadB(myObject);
        threadA.setName("a");
        threadB.setName("b");
        threadA.start();
        threadB.start();
    }
}

运行结果:

methodA begin

由结果可以看出 methodB一直没有被调用,也就是说线程B一直在等待线程A释放对象锁。对上述代码,进行如下修改

package com.demo2;

public class MyObject {
     public void methodA(){
        synchronized(new Object()){
            System.out.println("methodA begin");
            boolean flag = true;
            while(flag){
            }
            System.out.println("methodA end");
        }
    }
    public void methodB(){
        synchronized(new Object()){
            System.out.println("methodB begin");
            System.out.println("methodB end");
        }
    }
}
package com.demo2;

public class ThreadA extends Thread {
    private MyObject myObject;

    public ThreadA(MyObject myObject) {
        this.myObject = myObject;
    }

    @Override
    public void run() {
        myObject.methodA();
    }
}
package com.demo2;

public class ThreadB extends Thread {
    private MyObject myObject;

    public ThreadB(MyObject myObject) {
        this.myObject = myObject;
    }

    @Override
    public void run() {
        myObject.methodB();
    }
}
package com.demo2;

public class Run {
    public static void main(String[] args) {
        MyObject myObject = new MyObject();
        ThreadA threadA = new ThreadA(myObject);
        ThreadB threadB = new ThreadB(myObject);
        threadA.setName("a");
        threadB.setName("b");
        threadA.start();
        threadB.start();
    }
}

运行结果:

methodA begin
methodB begin
methodB end

由结果可以看出,线程B无需等待线程A释放锁,他们拿到的不是同一个对象锁,这样可以避免使用同步方法造成无限期等待的问题。

猜你喜欢

转载自blog.csdn.net/toyota_rav4/article/details/85206387
今日推荐