前言
利用多线程编程虽然能极大地提升运行效率,但是多线程本身的不稳定也会带来一系列的问题,其中最经典莫过于售票问题;这时就需要人为地加以限制和干涉已解决问题,譬如今日之主题——锁定。
锁定是我们在多线程中用来解决售票问题的工具,它的作用机制是将业务代码上锁;锁定后的区间同一时间只能允许一个线程进入运行,在该线程运行结束之前,其余线程均不得进入,只能在区间外等待。
实现
锁的实现在Java中有三种实现方式,以下将逐一展示。
方法一
利用Java提供的lock锁进行锁定
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class MyThread extends Thread {
private static int num = 1;
private static Lock lock = new ReentrantLock();
public MyThread(String s) {
this.setName(s);
}
public void run() {
while(true) {
lock.lock();
if(num < 31) {
System.out.println(this.getName() + "售出第" + num + "张票");
num++;
}
lock.unlock();
}
}
}
方法二
利用syncronized方法进行锁定。
class MyThread extends Thread {
private static int num = 1;
public MyThread(String s) {
this.setName(s);
}
public void run() {
while(true) {
synchronized(MyThread.class) {
if(num < 31) {
System.out.println(this.getName() + "售出第" + num + "张票");
num++;
}
}
}
}
}
注意
synchronized方法需要一个公共对象作为“锁头”。
方法三
同步方法实现
class MyThread extends Thread {
private static int num = 1;
public MyThread(String s) {
this.setName(s);
}
public void run() {
while(true) {
if(methood()) break;
}
}
private synchronized boolean methood() {
if(num > 30) return true;
System.out.println(this.getName() + "售出第" + num + "张票");
num++;
return false;
}
}