版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zwdwinter/article/details/52901782
启动类
public class LockTest {
public static void main(String[] args) {
ObjLock test = new ObjLock();
for (int i = 0; i < 5; i++) {
Thread thread = new LockThread(test);
thread.start();
}
}
}
线程类
public class LockThread extends Thread {
ObjLock lock;
public LockThread(ObjLock lock) {
this.lock = lock;
}
public void run() {
lock.syncObjMethod1();
lock.syncObjMethod2();
lock.syncPriObjMethod();
ObjLock.syncClaMethod();
}
/**
* 私有锁和对象锁不会产生竞争
* synchronized加在方法上和synchronized(this)均是对当前对象加锁,构成竞争关系同一时刻只能有一个方法能执行。
*/
}
方法类
public class ObjLock {
/** 私有对象 */
private Object object = new Object();
/**
* 对象锁方法
*/
public synchronized void syncObjMethod1() {
System.out.println("Obj Lock 1 begin" + ", time = " + System.currentTimeMillis() + "ms");
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Obj Lock 1 end");
}
/**
* 对象锁(采用synchronized (this))
*/
public void syncObjMethod2() {
synchronized (this) {
System.out.println("Obj Lock 2 begin" + ", time = " + System.currentTimeMillis() + "ms");
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Obj Lock 2 end");
}
}
/**
* 私有对象锁
*/
public void syncPriObjMethod() {
synchronized (object) {
System.out.println("Private Lock begin" + ", time = " + System.currentTimeMillis() + "ms");
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Private Lock end");
}
}
// 用于Class类锁计数
private static int claClockCount = 0;
/**
* 静态同步方法调用的是Class对象锁
*/
public static synchronized void syncClaMethod() {
System.out.println(
"Class Lock begin claClockCount = " + claClockCount + ", time = " + System.currentTimeMillis() + "ms");
claClockCount++;
try {
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Class Lock end");
}
}