package com.freeflying.thread.sync;
/**
* @ClassName: MuchObjMuchLock
* @Description:对个对象多个锁
* @author freeflying
* @date 2018年6月26日
*/
public class MuchObjMuchLock {
public static void main(String[] args) {
MuchObjMuchLockEx lockEx1=new MuchObjMuchLockEx();
MuchObjMuchLockEx lockEx2=new MuchObjMuchLockEx();
MuchLockA lockA=new MuchLockA(lockEx1);
lockA.start();
MuchLockB lockB=new MuchLockB(lockEx2);
lockB.start();
}
}
class MuchObjMuchLockEx{
private int num=0;
synchronized public void add(String username) {
try {
if("a".equals(username)) {
num=100;
System.out.println("a set over");
Thread.sleep(2000);
}else {
num=200;
System.out.println("b set over");
}
System.out.println(username + " num = "+num);
} catch (Exception e) {
// TODO: handle exception
}
}
}
class MuchLockA extends Thread{
private MuchObjMuchLockEx lock;
public MuchLockA(MuchObjMuchLockEx lock) {
this.lock=lock;
}
@Override
public void run() {
lock.add("a");
}
}
class MuchLockB extends Thread{
private MuchObjMuchLockEx lock;
public MuchLockB(MuchObjMuchLockEx lock) {
this.lock=lock;
}
@Override
public void run() {
lock.add("b");
}
}
结果:
a set over
b set over
b num = 200
a num = 100
结论:两个线程分别访问同一个类的两个不同实例的相同名称的同步方法,却是以异步的方式运行的
synchronized是对象锁,而不是把一段代码或者方法当做锁,