synchronized
资源类
class Data {
private int number = 0;
public synchronized void increase() {
while (number != 0) {
// 等待
try { wait(); } catch (InterruptedException e) { e.printStackTrace(); }
}
number++;
System.out.println(Thread.currentThread().getName() + " " + number);
// 通知唤醒
notifyAll();
}
public synchronized void decrease() {
while (number == 0) {
// 等待
try { wait(); } catch (InterruptedException e) { e.printStackTrace(); }
}
number--;
System.out.println(Thread.currentThread().getName() + " " + number);
// 通知唤醒
notifyAll();
}
}
线程操作资源类
public class Main {
public static void main(String[] args) {
Data data = new Data();
new Thread(() -> { for (int i = 0; i < 10; i++) data.increase(); }, "A").start();
new Thread(() -> { for (int i = 0; i < 10; i++) data.decrease(); }, "B").start();
new Thread(() -> { for (int i = 0; i < 10; i++) data.increase(); }, "C").start();
new Thread(() -> { for (int i = 0; i < 10; i++) data.decrease(); }, "D").start();
}
}
Lock
资源类
class Data {
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void increment() {
lock.lock();
try {
while (number != 0) {
condition.await();
}
number++;
System.out.println(Thread.currentThread().getName() + " " + number);
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void decrement() {
lock.lock();
try {
while (number == 0) {
condition.await();
}
number--;
System.out.println(Thread.currentThread().getName() + " " + number);
condition.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}