优点:节省资源
缺点:不同任务无法并行执行,效率低
package Thread2;
/**
* 可重入锁示例(单例模式)
*/
public class ReenTranLockDemo2 {
private Object currentThread;
private int lockTimes = 0;
private ReenTranLockDemo2() {}
public static ReenTranLockDemo2 getInstance() {
return staticClass.instance;
}
private static class staticClass {
private static final ReenTranLockDemo2 instance = new ReenTranLockDemo2();
}
public synchronized void lock() throws InterruptedException {
while (Thread.currentThread() == currentThread || currentThread == null || lockTimes > 0) {
if (Thread.currentThread() == currentThread) {
//当前线程重复加锁
lockTimes++;
System.out.println(1);
System.out.println(currentThread);
return;
} else if (currentThread == null) {
//当前线程首次加锁
currentThread = Thread.currentThread();
lockTimes++;
System.out.println(2);
System.out.println(currentThread);
return;
} else {
//锁已被占用,当前线程进入等待
wait();
System.out.println(3);
System.out.println(currentThread);
}
}
System.out.println("lockTime:" + lockTimes);
return;
}
public synchronized void unlock() {
if (currentThread != null && Thread.currentThread() == currentThread) {
if (1 == lockTimes) {
currentThread = null;
notify();
System.out.println(4);
System.out.println(currentThread);
} else {
System.out.println(5);
System.out.println(currentThread);
}
lockTimes--;
}
System.out.println("lockTime:" + lockTimes);
}
}
package Thread2;
public class RunReenTranLock2 {
private static int a;
private static int b;
public static void main(String[] args) throws InterruptedException {
Thread thread = getThread();
Thread thread1 = getThread1();
thread.start();
thread1.start();
thread.join();
thread1.join();
System.out.println("a:" + a);
System.out.println("b:" + b);
}
public static Thread getThread() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
ReenTranLockDemo2.getInstance().lock();
for (int i = 0; i < 10000; i++) {
a++;
}
method1();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
ReenTranLockDemo2.getInstance().unlock();
}
}
});
return thread;
} public static Thread getThread1() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
ReenTranLockDemo2.getInstance().lock();
for (int i = 0; i < 10000; i++) {
b++;
}
method2();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
ReenTranLockDemo2.getInstance().unlock();
}
}
});
return thread;
}
public static void method1() throws InterruptedException {
ReenTranLockDemo2.getInstance().lock();
try {
for (int i = 0; i < 10000; i++) {
a++;
}
} finally {
ReenTranLockDemo2.getInstance().unlock();
}
}
public static void method2() throws InterruptedException {
ReenTranLockDemo2.getInstance().lock();
try {
for (int i = 0; i < 10000; i++) {
b++;
}
method3();
} finally {
ReenTranLockDemo2.getInstance().unlock();
}
}
public static void method3() throws InterruptedException {
ReenTranLockDemo2.getInstance().lock();
try {
for (int i = 0; i < 10000; i++) {
b++;
}
} finally {
ReenTranLockDemo2.getInstance().unlock();
}
}
}
测试结果
2
Thread[Thread-0,5,main]
1
Thread[Thread-0,5,main]
5
Thread[Thread-0,5,main]
lockTime:1
4
null
lockTime:0
3
null
2
Thread[Thread-1,5,main]
1
Thread[Thread-1,5,main]
1
Thread[Thread-1,5,main]
5
Thread[Thread-1,5,main]
lockTime:2
5
Thread[Thread-1,5,main]
lockTime:1
4
null
lockTime:0
a:20000
b:30000