三大案例再升级
【小城贝尔】
三大案例再升级,模拟影院票信息。
一个影院多人座,好似关系一对多。
时长多用块中锁,买票操作多端落。
现在挑战方法锁,操作即往一种括。
及时线程来强转,抓住子类来平反。
容器并发J U C,数组书写上拷贝。
内部已有安全锁,线程万千易操作。
三大案例再升级,模拟影院票信息。
一个影院多人座,好似关系一对多。
class HappyCimema{
List<Integer> cSeat;
String cName;
public HappyCimema(List<Integer> cSeat, String cName) {
this.cSeat = cSeat;
this.cName = cName;
}
}
class Client implements Runnable{
private HappyCimema hc;
private List<Integer> seats;
public Client(HappyCimema hc, List<Integer> seats) {
this.hc = hc;
this.seats = seats;
}
@Override
public void run() {
buyFilmTickets();
}
public boolean buyFilmTickets() {
//双重检测
if(hc.cSeat.size() == 0){
System.out.println(Thread.currentThread().getName() + "不好意思 票买完啦。。。。。。 ");
return false;
}
synchronized (hc) {
//获得影院所有的座位
List<Integer> cSeat = hc.cSeat;
//拷贝一份影院座位操作
List<Integer> copy = new ArrayList<>();
copy.addAll(cSeat);
//将选定的座位和影院已经有的座位比较
copy.removeAll(seats);
//入过影院的座位数减去操作后的数量 刚好等于我们选得座位则购票成功
if (cSeat.size() - copy.size() == seats.size()) {
this.hc.cSeat = copy;
System.out.println(Thread.currentThread().getName() + "您已经购票 ====> " + this.seats + "还剩下座位===>" + this.hc.cSeat);
return true;
} else {
System.out.println(Thread.currentThread().getName() + "您购票失败 你的选择是 :====> " + this.seats + "还剩下座位是:===>" + this.hc.cSeat);
return false;
}
}
}
}
class TestHappyCimema{
public static void main(String[] args) {
List<Integer> cSeate = new ArrayList<>();
cSeate.add(1);
cSeate.add(2);
cSeate.add(3);
cSeate.add(4);
cSeate.add(5);
cSeate.add(6);
cSeate.add(7);
List<Integer> c1 = new ArrayList<>();
c1.add(2);
c1.add(3);
List<Integer> c2 = new ArrayList<>();
c2 .add(4);
c2 .add(3);
List<Integer> c3 = new ArrayList<>();
c3.add(1);
c3.add(5);
c3.add(6);
HappyCimema hc = new HappyCimema(cSeate,"HappyCimemaa");
new Thread(new Client(hc,c1),"亚历山大").start();
new Thread(new Client(hc,c2),"马相伯").start();
new Thread(new Client(hc,c3),"图灵").start();
}
}
> "C:\Program Files (x86)\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\intellij\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar=53869:D:\intellij\IntelliJ IDEA 2019.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-32.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\rt.jar;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\out\production\untitled;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\src\commons-io-2.6.jar;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\src\commons-io-2.6-tests.jar;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\src\commons-io-2.6-javadoc.jar;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\src\commons-io-2.6-sources.jar;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\src\commons-io-2.6-test-sources.jar" concurrently.ThreeDemoPluse.TestHappyCimema
亚历山大您已经购票 ====> [2, 3]还剩下座位===>[1, 4, 5, 6, 7]
图灵您已经购票 ====> [1, 5, 6]还剩下座位===>[4, 7]
马相伯您购票失败 你的选择是 :====> [4, 3]还剩下座位是:===>[4, 7]
Process finished with exit code 0
时长多用块中锁,买票操作多端落。
现在挑战方法锁,操作即往一种括。
及时线程来强转,抓住子类来平反。
/***************************使用方法锁***************************/
class Web12306 implements Runnable{
int tickets = 100;
@Override
public void run() {
sellTickets();
}
private synchronized void sellTickets() {
Passager p = (Passager) Thread.currentThread();
//获得用户想购买的票数
int num = p.tickes;
int bougt = 0;
while (num > 0) {
if (tickets <= 0) {
System.out.println(Thread.currentThread().getName() + "票没了");
return;
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "你已成功购票 "+(++bougt) + " 还剩下 ====》 "+(--tickets));
num--;
}
}
}
class Passager extends Thread{
int tickes;
String pName;
public Passager(Runnable target , int tickes, String pName) {
super(target,pName);
this.tickes = tickes;
}
}
class TestWeb12306{
public static void main(String[] args) {
Web12306 we = new Web12306();
Passager p = new Passager(we,8,"支付宝");
Passager p1 = new Passager(we,10,"美团");
Passager p2 = new Passager(we,3,"微信");
p.start();
p1.start();
p2.start();
Passager p3 = new Passager(we,10,"平多多");
Passager p4 = new Passager(we,9,"京东");
p3.start();
p4.start();
}
}
> "C:\Program Files (x86)\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:D:\intellij\IntelliJ IDEA 2019.1.2\lib\idea_rt.jar=53853:D:\intellij\IntelliJ IDEA 2019.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-32.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files (x86)\Java\jdk1.8.0_201\jre\lib\rt.jar;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\out\production\untitled;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\src\commons-io-2.6.jar;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\src\commons-io-2.6-tests.jar;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\src\commons-io-2.6-javadoc.jar;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\src\commons-io-2.6-sources.jar;C:\Users\Administrator.QH-20190223RNEB\IdeaProjects\untitled\src\commons-io-2.6-test-sources.jar" concurrently.ThreeDemoPluse.TestWeb12306
支付宝你已成功购票 1 还剩下 ====》 99
支付宝你已成功购票 2 还剩下 ====》 98
支付宝你已成功购票 3 还剩下 ====》 97
支付宝你已成功购票 4 还剩下 ====》 96
支付宝你已成功购票 5 还剩下 ====》 95
支付宝你已成功购票 6 还剩下 ====》 94
支付宝你已成功购票 7 还剩下 ====》 93
支付宝你已成功购票 8 还剩下 ====》 92
平多多你已成功购票 1 还剩下 ====》 91
平多多你已成功购票 2 还剩下 ====》 90
平多多你已成功购票 3 还剩下 ====》 89
平多多你已成功购票 4 还剩下 ====》 88
平多多你已成功购票 5 还剩下 ====》 87
平多多你已成功购票 6 还剩下 ====》 86
平多多你已成功购票 7 还剩下 ====》 85
平多多你已成功购票 8 还剩下 ====》 84
平多多你已成功购票 9 还剩下 ====》 83
平多多你已成功购票 10 还剩下 ====》 82
美团你已成功购票 1 还剩下 ====》 81
美团你已成功购票 2 还剩下 ====》 80
美团你已成功购票 3 还剩下 ====》 79
美团你已成功购票 4 还剩下 ====》 78
美团你已成功购票 5 还剩下 ====》 77
美团你已成功购票 6 还剩下 ====》 76
美团你已成功购票 7 还剩下 ====》 75
美团你已成功购票 8 还剩下 ====》 74
美团你已成功购票 9 还剩下 ====》 73
美团你已成功购票 10 还剩下 ====》 72
京东你已成功购票 1 还剩下 ====》 71
京东你已成功购票 2 还剩下 ====》 70
京东你已成功购票 3 还剩下 ====》 69
京东你已成功购票 4 还剩下 ====》 68
京东你已成功购票 5 还剩下 ====》 67
京东你已成功购票 6 还剩下 ====》 66
京东你已成功购票 7 还剩下 ====》 65
京东你已成功购票 8 还剩下 ====》 64
京东你已成功购票 9 还剩下 ====》 63
微信你已成功购票 1 还剩下 ====》 62
微信你已成功购票 2 还剩下 ====》 61
微信你已成功购票 3 还剩下 ====》 60
Process finished with exit code 0
容器并发J U C,数组书写上拷贝。
内部已有安全锁,线程万千易操作。
/**********************************************************/
class CopyOnWriteArray{
public static void main(String[] args) {
//是线程安全的
java.util.concurrent.CopyOnWriteArrayList<Integer> cowal = new java.util.concurrent.CopyOnWriteArrayList<Integer>();
cowal.add(1);
}
}