Java类锁、对象锁、私有锁冲突测试
类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明。
一、相关约定
为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定:
1.类锁:在代码中的方法上加了static和synchronized的锁,或者synchronized(xxx.class)的代码段,如下文中的increament();
2.对象锁:在代码中的方法上加了synchronized的锁,或者synchronized(this)的代码段,如下文中的synOnMethod()和synInMethod();
3.私有锁:在类内部声明一个私有属性如privateObjectlock,在需要加锁的代码段synchronized(lock),如下文中的synMethodWithObj()。
二、测试代码
1.编写一个启动类ObjectLock
publicclassObjectLock{ publicstaticvoidmain(String[]args){ System.out.println("starttime="+System.currentTimeMillis()+"ms"); LockTestClasstest=newLockTestClass(); for(inti=0;i<3;i++){ Threadthread=newObjThread(test,i); thread.start(); } } }
2.编写一个线程类ObjThread,用于启动同步方法(注意它的run方法可能会调整以进行不同的测试)
publicclassObjThreadextendsThread{ LockTestClasslock; inti=0;
publicObjThread(LockTestClasslock,inti){ this.lock=lock; this.i=i; }
publicvoidrun(){ //无锁方法 // lock.noSynMethod(this.getId(),this); //对象锁方法1,采用synchronizedsynInMethod的方式 lock.synInMethod(); //对象锁方法2,采用synchronized(this)的方式 // lock.synOnMethod(); //私有锁方法,采用synchronized(object)的方式 // lock.synMethodWithObj(); //类锁方法,采用staticsynchronizedincrement的方式 LockTestClass.increment(); } }