图解java多线程设计模式之一一synchronized实例方法体

synchronized实例方法体和synchronized代码块

synchronied void method(){

            .......
        }

 

这个等同于下面将方法体用synchronized(this)代码块包围起来

void method(){
    synchronized(this) {
        .......
    }
}

 这也就是说,synchronized实例方法是使用this(实例对象)的锁来执行线程的互斥处理的

如果想用synchronized锁方法那么,需保证只有一个实例对象,如果你将

用这个锁Thread内的一个方法,则,每个xxxThread.synchronizedMethod执行时,锁的是每个线程实例

,那个锁就不起作用了;只有3个线程都锁同一个对象才能保证互斥;

在single Threaded Execution中,三个人频繁通过一个只允许一个经过的门的情形

当人们通过门的时候,统计人数便会增加.另外程序还会记录通行者的"姓名与地址"

思路即UserThread建三个线程,gate类表示门

自己设计UserThread下面有一个进入门方法 使用synchronized修饰

    public synchronized void entergate() throws InterruptedException {
        System.out.println(this.addr+":  getCount***********"+gate.getCount());
        Thread.sleep(1* new Random().nextInt(10));

        gate.setCount(gate.getCount()+1);
       gate.setName(this.name);
       gate.setAddr(this.addr);

    }

 这个就会出现问题,因为3个线程,每个线程在执行entergate()锁的都是自己对象,那么就不能保证设计目的了

找出错误为下图

  

posted @ 2020-12-25 11:17  张艳涛&java  阅读(171)  评论(0编辑  收藏  举报