synchronized与ReentrantLock实现共享资源的消费
主方法
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实现共享资源的消费的更多相关文章
- java解决共享资源竞争
由于多线程的实现,在运行一个程序的时候可能会有很多的线程在同时运行,但是线程的调度并不是可见的,所以不会知道一个线程什么时候在运行,比如说 你坐在桌子前手拿着叉子,正要去叉盘中的最后一片食物,当你的叉 ...
- JAVA学习笔记 -- 多线程之共享资源
在多线程程序执行过程中,可能会涉及到两个或者多个线程试图同一时候訪问同一个资源.为了防止这样的情况的发生,必须在线程使用共享资源时给资源"上锁",以阻挡其他线程的訪问. 而这样的机 ...
- 线程同步synchronized和ReentrantLock
一.线程同步问题的产生及解决方案 问题的产生: Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突. 如下例:假设有一个卖票 ...
- 关于java多线程任务执行时共享资源加锁的方式思考
1.加锁方式: 1-1.使用synchronized关键字进行方法或代码块的加锁方式 1-2.使用ReentrantLock类提供的lock()方法的方式 2.代码实现(传统的银行取款存款问题): 2 ...
- 关于synchronized和ReentrantLock之多线程同步详解
一.线程同步问题的产生及解决方案 问题的产生: Java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),将会导致数据不准确,相互之间产生冲突. 如下例:假设有一个卖票 ...
- volatile、synchronized、ReentrantLock与CAS
目录 一.JVM内存模型: 二.volatile关键字 1.volatile保证内存可见性. 2.能禁止指令重排序 3.不能保证原子性 三.synchronized关键字 1.内存可见性: 2.操作的 ...
- flink03-----1.Task的划分 2.共享资源槽 3.flink的容错
1. Task的划分 在flink中,划分task的依据是发生shuffle(也叫redistrubute),或者是并行度发生变化 1. wordcount为例 package cn._51doit ...
- 高级java必会系列二:多线程经常使用的3个关键字:synchronized、ReentrantLock、volatile
系列一讲解了多线程,本章讲解多线程开发中经常使用到的3个关键字synchronized.ReentrantLock.volatile. 一.synchronized 互斥锁,即操作互斥,并发线程过来, ...
- synchronized和ReentrantLock
一.什么是sychronized sychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类. 在修饰代码块的时候需要一个reference对象作为锁的对象. 在修饰方法的时候默 ...
随机推荐
- 计算机网络OSI参考模型与tcp/ip四层模型
OSI参考模型--7层 1层物理层:主要定义物理设备标准,如网线的接口类型.光线的接口类型.各种传输介质的传输速率等.它的主要作用是传输比特流(就是由1.0转化为电流强弱来进行传输,到达目的地后在转化 ...
- 调用API函数减少c#内存占用(20+m减至1m以下)
原文:调用API函数减少c#内存占用(20+m减至1m以下) c#虽然内置垃圾回收机制,但是并不能解决程序占用内存庞大的问题,如果我们仔细观察任务管理器,我们会发现一个程序如果最小化的时候,它所占用的 ...
- WPF中的资源(一) - 静态资源和动态资源
原文:WPF中的资源(一) - 静态资源和动态资源 WPF中,每个界面元素都含有一个名为Resources的属性,其存储的是以"键-值"对形式存在的资源,而其子级元素在使用这些资源 ...
- linux 用蓝牙和手机通信
加载模块: # modprobe hci_usb # modprobe rfcomm # hciconfig hci0 up # hciconfig hci0 up 查看状况: # hci ...
- C++成员函数指针错误用法警示(成员函数指针与高性能的C++委托,三篇),附好多评论
今天做一个成绩管理系统的并发引擎,用Qt做的,仿照QtConcurrent搞了个模板基类.这里为了隐藏细节,隔离变化,把并发的东西全部包含在模板基类中.子类只需注册需要并发执行的入口函数即可在单独线程 ...
- 深入理解Amazon Alexa Skill(二)
理解skill调用 本节来更详细的讨论alexa是如何确定调用哪个skill的. 参考:https://developer.amazon.com/zh/docs/custom-skills/under ...
- C#获取带汉字的字符串长度
正常情况下,我们是直接去string的length的,但是汉字是有两个字节的,所以直接用length是错的.如下图: 所以应该用以下代码来获取长度: private void button1_Clic ...
- System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序。
今天在写导入Excel表格的代码,运行时却报异常,异常信息: System.InvalidOperationException: 未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0 ...
- Android零基础入门第29节:善用TableLayout表格布局,事半功倍
原文:Android零基础入门第29节:善用TableLayout表格布局,事半功倍 前面学习了线性布局和相对布局,线性布局虽然方便,但如果遇到控件需要排列整齐的情况就很难达到要求,用相对布局又比较麻 ...
- Decision Tree
Decision Tree builds classification or regression models in the form of a tree structure. It break d ...