package com.bootdo.wang;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 4.使用重入锁实现线程同步
* ReentrantLock类是可重入、互斥、实现了Lock接口的锁,
* 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力
* ReenreantLock类的常用方法有:
*
* ReentrantLock() : 创建一个ReentrantLock实例
* lock() : 获得锁
* unlock() : 释放锁
*/
public class ReentrantLockSychronization {
class Bank {
private int account = 10;
Lock lock = new ReentrantLock();
public int getAccount() {
return account;
}
public void saveAccount(int money) {
lock.lock();
try {
account += money;
System.out.println("account:" + account);
} finally {
lock.unlock();
}
}
}
class ReentrantThread implements Runnable {
private Bank bank;
public ReentrantThread(Bank bank) {
this.bank = bank;
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
bank.saveAccount(10);
System.out.println(Thread.currentThread().getName() + "-->当前余额:" + bank.getAccount() + "元。");
}
}
}
public void userReentrantLockThread() {
Bank bank = new Bank();
ReentrantThread reentrantThread = new ReentrantThread(bank);
Thread thread1 = new Thread(reentrantThread);
Thread thread2 = new Thread(reentrantThread);
thread1.start();
thread2.start();
}
public static void main(String[] args) {
ReentrantLockSychronization reentrantLockSychronization = new ReentrantLockSychronization();
reentrantLockSychronization.userReentrantLockThread();
}
}
输出:
account:20
account:30
Thread-0-->当前余额:30元。
account:40
Thread-0-->当前余额:40元。
account:50
Thread-0-->当前余额:50元。
account:60
Thread-1-->当前余额:30元。
Thread-0-->当前余额:60元。
account:70
Thread-1-->当前余额:70元。
account:80
Thread-0-->当前余额:80元。
account:90
Thread-1-->当前余额:90元。
account:100
account:110
Thread-0-->当前余额:100元。
Thread-1-->当前余额:110元。
account:120
Thread-0-->当前余额:120元。
account:130
Thread-1-->当前余额:130元。
account:140
Thread-0-->当前余额:140元。
account:150
Thread-1-->当前余额:160元。
account:160
Thread-0-->当前余额:160元。
account:170
Thread-1-->当前余额:170元。
account:180
Thread-0-->当前余额:180元。
account:190
Thread-1-->当前余额:190元。
account:200
Thread-1-->当前余额:200元。
account:210
Thread-1-->当前余额:210元。