解决多线程中线程安全问题方式三

import java.util.concurrent.locks.ReentrantLock;

/**
* 解决多线程中线程安全问题方式三:调用Lock接口
1.因为Lock是接口,无法直接使用,所以使用Lock的实现类ReentrantLock
2.jdk5后新增的特性
3.lock需要手动调用lock()方法开启同步锁,当同步逻辑完成后,也需要手动调用unlock()方法来结束同步
*/
public class LockDemo {
    public static void main(String[] args) {
        //实现方式
        window1 w1 = new window1();
        Thread t1 = new Thread(w1);
        Thread t2 = new Thread(w1);
        Thread t3 = new Thread(w1);
        t1.setName("Implement窗口1");
        t2.setName("Implement窗口2");
        t3.setName("Implement窗口3");
        t1.start();
        t2.start();
        t3.start();

        //继承方式
//        window2 w = new window2();
//        window2 w2 = new window2();
//        window2 w3 = new window2();
//
//        w.setName("Extends窗口1");
//        w2.setName("Extends窗口2");
//        w3.setName("Extends窗口3");
//        w.start();
//        w2.start();
//        w3.start();


    }
}



/*实现方式*/
class window1 implements Runnable {

    private int num = 100;

    private ReentrantLock lock = new ReentrantLock();
//    private ReentrantLock lock = new ReentrantLock(true);  //代表公平锁,按照线程进入的先后顺序执行
    @Override
    public void run() {
        while(true){
            try {
                lock.lock();
                if(num > 0){
                    System.out.println(Thread.currentThread().getName() + "卖票,票号为:" + num);
                    num --;
                }else{
                    break;
                }
            }finally{
                lock.unlock();
            }

        }
    }
}

/*继承方式*/
class window2 extends Thread{
    private static int num = 100;
    private static ReentrantLock lock = new ReentrantLock();

    @Override
    public void run() {
        while(true){
            try {
                lock.lock();
                if(num > 0){
                    System.out.println(Thread.currentThread().getName() + "卖票,票号为:" + num);
                    num--;
                }else{
                    break;
                }
            }finally{
                lock.unlock();
            }
        }
    }
}

 

posted @ 2023-02-01 16:26  那、就这样吧  阅读(33)  评论(0)    收藏  举报