package com.www.java1;
import java.util.concurrent.locks.ReentrantLock;
/**
* 解决线程安全的方式三:Lock锁
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
public class LockTest {
public static void main(String[] args) {
Window win = new Window();
Thread t1 = new Thread(win);
Thread t2 = new Thread(win);
Thread t3 = new Thread(win);
t1.setName("线程一");
t2.setName("线程二");
t3.setName("线程三");
t1.start();
t2.start();
t3.start();
}
}
class Window implements Runnable{
private static int num = 100;
//实例化Reentrantlock
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while(true){
try{
//2.调用锁定方法lock()
lock.lock();
if(num > 0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + num);
num--;
}else break;
}finally{
//3.调用解锁方法
lock.unlock();
}
}
}
}
例题
package com.www.java2;
import java.util.concurrent.locks.ReentrantLock;
/**
* @author www
* @creat 2022-{MONTH}-{DAY}
*/
public class BankTest {
public static void main(String[] args) {
Bank bank = new Bank();
Thread t1 = new Thread(bank);
Thread t2 = new Thread(bank);
t1.setName("储户1");
t2.setName("储户2");
t1.start();
t2.start();
}
}
class Bank implements Runnable {
private int account = 0;
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
try{
lock.lock();
for(int i = 0; i < 3; i++){
account += 1000;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "存钱成功。余额为:" + account);
}
}finally{
lock.unlock();
}
}
}
//public class BankTest {
// public static void main(String[] args) {
// Account at = new Account(0.0);
// Customer c1 = new Customer(at);
// Customer c2 = new Customer(at);
// c1.setName("储户一");
// c2.setName("储户二");
// c1.start();
// c2.start();
// }
//}
//class Customer extends Thread{
// private Account account;
// public Customer(Account account){
// this.account = account;
// }
private ReentrantLock lock = new ReentrantLock();
// @Override
// public void run() {
//
// for(int i = 0; i < 3; i++){
// account.depoist(1000.0);
//
// }
//
// }
//}
//class Account{
// double balance;
// public Account(double balance){
// this.balance = balance;
// }
// public synchronized void depoist(double amt){
// if(amt > 0){
// balance += amt;
// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName() + "存钱成功。余额为:" + balance);
// }
//
// }
//}