当前位置: 移动技术网 > IT编程>开发语言>Java > synchronized与ReentrantLock实现共享资源的消费

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

2018年08月18日  | 移动技术网IT编程  | 我要评论

主方法

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同样的效果。

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网