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同样的效果。
推荐阅读
-
synchronized与ReentrantLock实现共享资源的消费
-
兰芝首度携手天猫超级品牌日,实现品牌与消费端的深度链接
-
关于synchronized和ReentrantLock实现卖票功能以及synchronized的对象锁和全局锁验证
-
synchronized与ReentrantLock的并发性能对比
-
Java多线程之生产者-消费者模型的三种写法(Synchronized、ReentrantLock、ArrayBlockingQueue)
-
兰芝首度携手天猫超级品牌日,实现品牌与消费端的深度链接
-
Java中Synchronized与ReentrantLock的不同以及ReentrantLock的使用
-
CAS(比较并交换)学习CAS实现原子性+volatile实现可见性,cas与synchronized比较的优缺点
-
java的两种同步方式, Synchronized与ReentrantLock的区别
-
Synchronized与ReentrantLock(重入锁)的区别