图解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()锁的都是自己对象,那么就不能保证设计目的了
找出错误为下图