模拟互斥锁的实现
在并发交互的进程中存在竞争关系和协调关系,互斥锁就是用来实现竞争的进程的同步的
竞争主要是体现在临界区的访问上的,临界区是访问共享资源的一段代码块,进程通过访问临界区进而访问共享资源。因为对临界资源异步的进行访问,可能会使得我们程序出现因为访问顺序错误而产生的错误
我们的程序通过java的多线程来模拟多线程并发执行的环境,通过对互斥锁2个重要的方法的实现来模拟互斥锁的功能
lock():检查锁的状态:1.锁关闭则进入自旋等待 2.锁打开则设置锁为关闭状态
unlock():将锁的状态设置为打开状态
- 互斥锁工具类
package com.os;
import java.util.concurrent.BlockingDeque;
//提供互斥锁的方法
public class MutexUtils {
private static boolean lock = true;//默认锁是打开的
private MutexUtils(){};
public static void lock(){
while (!lock){//测试锁的状态
}
lock = false;//关闭锁(设置锁)
}
public static void unlock(){
lock = true;//打开锁
}
}
- 线程工作类
package com.os;
//多线程售卖电影票
public class MyThread extends Thread{
private static int ticket = 1000000;//票数为100张
@Override
public void run() {
while (ticket>0){
MutexUtils.lock();
System.out.println("线程"+Thread.currentThread().getName()+"正在卖第"+(1000001-ticket)+"张票");
ticket--;
MutexUtils.unlock();
}
}
}
- 测试类
package com.os;
public class MutexTest {
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
MyThread myThread3 = new MyThread();
myThread1.start();
myThread2.start();
myThread3.start();
}
}
- 对买票实现了同步