欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

synchronized与ReentrantLock实现共享资源的消费

程序员文章站 2023-12-25 12:50:21
主方法 synchronized线程方法1: ReentrantLock线程方法2: 总结: synchronized在这里将run()方法加入了锁,其他线程方法时如果当前锁没有释放进去等待状态等线程释放锁后进入锁的争夺。每次只允许一个线程访问。 ReentrantLock 利用lock.lock( ......

主方法

public class synchronizedtest {
    public static void main(string[] args) {
        long starttime = system.currenttimemillis();  
        ticketsystem ticketsystem=new ticketsystem();
        thread  t1=new thread(ticketsystem);
        thread  t2=new thread(ticketsystem);
        thread  t3=new thread(ticketsystem);
        thread  t4=new thread(ticketsystem);
        t1.setname("1号售票点");
        t2.setname("2号售票点");
        t3.setname("3号售票点");
        t4.setname("4号售票点");
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        while (true) {
            if(ticketsystem.getticketnumber()<=0){
                long endtime = system.currenttimemillis();  
                float seconds = (endtime - starttime) / 1000f;  
                system.out.println(float.tostring(seconds) + " seconds."); 
                break;
            }
        }
    }
}

synchronized线程方法1:

public class ticketsystem implements runnable {

    private static volatile int ticketnumber = 900;


    public int getticketnumber() {
        return this.ticketnumber;
    }

    @override
    public synchronized  void run() {
        while (true) {
            if (ticketnumber <= 0) {
                break;
            } else {
                system.out.println(thread.currentthread().getname() + "卖了最后第" + ticketnumber + "票");
                ticketnumber--;
            }
        }
    }

}

reentrantlock线程方法2:

public class ticketsystem implements runnable {

    private static volatile int ticketnumber = 900;

    private reentrantlock lock = new reentrantlock();

    public int getticketnumber() {
        return this.ticketnumber;
    }

    @override
    public void run() {
        while (true) {
            lock.lock();
            if (ticketnumber <= 0) {
                break;
            } else {
                system.out.println(thread.currentthread().getname() + "卖了最后第" + ticketnumber + "票");
                ticketnumber--;
            }
            lock.unlock();
        }
    }

}

总结:

synchronized在这里将run()方法加入了锁,其他线程方法时如果当前锁没有释放进去等待状态等线程释放锁后进入锁的争夺。每次只允许一个线程访问。

reentrantlock 利用lock.lock()获得锁,lock.unlock()释放锁,实现与synchronized同样的效果。

 

上一篇:

下一篇: