2.2.11同步synchronized方法无限等待与解决

同步方法易造成死循环

/**
 * @author wuyoushan
 * @date 2017/4/10.
 */
public class Service {
    synchronized public void methodA(){
        System.out.println("methodA begin");
        boolean isContinueRun=true;
        while (isContinueRun){

        }
        System.out.println("methodA end");
    }

    synchronized public void methodB(){
        System.out.println("methodB begin");
        System.out.println("methodB end");
    }
}

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadA extends Thread{

    private Service service;

    public ThreadA(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
       super.run();
        service.methodA();
    }
}

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadB extends Thread{

   private Service service;

    public ThreadB(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
        super.run();
        service.methodB();
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args){
      Service service=new Service();
      ThreadA a=new ThreadA(service);
      a.start();
      ThreadB b=new ThreadB(service);
      b.start();
    }
}

程序的运行结果为:

methodA begin


线程B永远得不到运行的机会,锁死了。这时候可以用同步块来解决这样的问题。更改Service.java文件代码如下:

/**
 * @author wuyoushan
 * @date 2017/4/10.
 */
public class Service {
    Object object1=new Object();
    public void methodA(){
        synchronized (object1) {
            System.out.println("methodA begin");
            boolean isContinueRun = true;
            while (isContinueRun) {

            }
            System.out.println("methodA end");
        }
    }
    Object object2=new Object();
    public void methodB(){
        synchronized (object2) {
            System.out.println("methodB begin");
            System.out.println("methodB end");
        }
    }
}

程序的运行结果为:

methodA begin
methodB begin
methodB end

摘选自 java多线程核心编程技术-2.2.11

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,955评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,469评论 19 139
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 9,136评论 0 11
  • 把下雨天留给回忆,可能平时想不起,低沉的氛围,更适合整理自己。
    陌冰青阅读 1,046评论 0 0
  • 不得不承认 我们真是一个矛盾体 一边要求自己不断的上进 在非常优秀的环境里害怕没有安全感 又退到了自己觉得安全的环...
    蜜思琳的世界阅读 1,729评论 0 0