Java多线程之~~~synchronized添加参数来实现独立的代码片段
来源:互联网 发布:羽鹤升级数据 编辑:程序博客网 时间:2024/06/03 15:39
有时候我们并不想在整个方法前面加上synchronized这个关键字,这样会使整个方法调用变的缓慢,我们只在关键
代码的地方增加这个synchronized这个关键字,然后这样就能加快方法或者代码的执行效率。然后可能还有一种情况就
是,我们有两个变量,其中任何一个变量都是同时只能一个变量访问,但是两个变量可以在同时被两个变量访问,这种
需求下我们就得使用sychronized的带参数的方法来实现这种需求。
下面我们来看一个例子,一个模拟电影院售票的例子
[java] view plain copy print?
package com.bird.concursey.charpet2;
public class Cinema {
private long vacanciesCinema1; private long vacanciesCinema2; private final Object controlCinema1 = new Object(); private final Object controlCinema2 = new Object(); public Cinema() { vacanciesCinema1 = 20; vacanciesCinema2 = 20; } public boolean sellTickets1(int number) { synchronized (controlCinema1) { if(number < vacanciesCinema1) { vacanciesCinema1 -= number; return true; }else{ return false; } } } public boolean sellTickets2(int number) { synchronized (controlCinema2) { if(number < vacanciesCinema2) { vacanciesCinema2 -= number; return true; }else{ return false; } } } public boolean returnTicket1(int number) { synchronized (controlCinema1) { vacanciesCinema1 += number; return true; } } public boolean returnTicket2(int number) { synchronized (controlCinema2) { vacanciesCinema2 += number; return true; } } public long getVacanciesCinema1() { return vacanciesCinema1; } public void setVacanciesCinema1(long vacanciesCinema1) { this.vacanciesCinema1 = vacanciesCinema1; } public long getVacanciesCinema2() { return vacanciesCinema2; } public void setVacanciesCinema2(long vacanciesCinema2) { this.vacanciesCinema2 = vacanciesCinema2; }
}
下面是实际售票的类
[java] view plain copy print?
package com.bird.concursey.charpet2;
public class TicketOffice1 implements Runnable {
private Cinema cinema; public TicketOffice1(Cinema cinema) { this.cinema = cinema; } @Override public void run() { cinema.sellTickets1(3); cinema.sellTickets1(2); cinema.sellTickets2(2); cinema.returnTicket1(3); cinema.sellTickets1(5); cinema.sellTickets2(2); cinema.sellTickets2(2); cinema.sellTickets2(2); }
}
[java] view plain copy print?
package com.bird.concursey.charpet2;
public class TicketOffice2 implements Runnable {
private Cinema cinema; public TicketOffice2(Cinema cinema) { this.cinema = cinema; } @Override public void run() { cinema.sellTickets2(2); cinema.sellTickets2(4); cinema.sellTickets1(2); cinema.sellTickets1(1); cinema.returnTicket2(2); cinema.sellTickets1(3); cinema.sellTickets2(2); cinema.sellTickets1(2); } public static void main(String[] args) { Cinema cinema = new Cinema(); TicketOffice1 ticketOffice1 = new TicketOffice1(cinema); Thread thread1 = new Thread(ticketOffice1, "TicketOffice1"); TicketOffice2 ticketOffice2 = new TicketOffice2(cinema); Thread thread2 = new Thread(ticketOffice2, "TicketOffice2"); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.printf("Room 1 Vacancies: %d\n",cinema.getVacanciesCinema1()); System.out.printf("Room 2 Vacancies: %d\n",cinema.getVacanciesCinema2()); }
}
这里可以看到,每次运行都会是期望的效果,而且通过单例模式,我们很好的控制了两个属性的访问顺序,很好的实
现了我们的需求。
0 0
- Java多线程之~~~synchronized添加参数来实现独立的代码片段
- Java多线程之~~~synchronized添加参数来实现独立的代码片段
- Java多线程之synchronized
- Java多线程之synchronized
- java多线程之synchronized
- java多线程之synchronized
- Java多线程之synchronized
- 多线程 之 Synchronized 锁的实现原理
- Java多线程之synchronized的使用技巧
- JavaSE 之 ----- 常用的 Java 代码片段
- Java分页代码的独立实现
- java多线程之-----静态同步synchronized方法与synchronized(class) 代码块
- Java多线程总结之 synchronized
- Java多线程之~~~~synchronized 方法
- (二)java多线程之synchronized
- 【Java基础】多线程之synchronized
- Java多线程之synchronized关键字
- JAVA多线程之Synchronized关键字
- 二张图片叠加到一起
- 文章标题
- 数据库(第一范式,第二范式,第三范式)
- FormData表单数据对象(h5)快速收集表单信息(注册登录时使用的)
- ABP实时服务-通知系统.发布模式
- Java多线程之~~~synchronized添加参数来实现独立的代码片段
- 217. Contains Duplicate Add to List(C++)
- 关于webstorm开发angular遇到的一些小问题(强迫症喜欢的)
- log4j配置使用
- redis配置认证密码以及远程访问
- css小细节罗列
- iframe 触发父页面方法,javascript子窗口获取父窗口失败原因
- iOS中是正则判断否含特殊字符
- python 内置数据结构的基本操作 —— dict(2)