主方法
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同样的效果。
如对本文有疑问, 点击进行留言回复!!
springmvc之ResponseBody响应json数据遇到的错误及解决
uni-app 后台升级 静默升级 uniapp 后台更新 静默更新 在线升级
SpringBoot多Module启动报错Could not transfer metadata
Hibernate项目报错:Cannot call sendError() after the response has been committed
网友评论