java的知识点32——多线程 并发同步的 性能分析、快乐影院 订票操作
多线程 并发 同步 性能分析
/*** 线程安全: 在并发时保证数据的正确性、效率尽可能高* synchronized* 1、同步方法* 2、同步块* @author Administrator**/
public class SynBlockTest03 {public static void main(String[] args) {//一份资源SynWeb12306 web =new SynWeb12306();//多个代理new Thread(web,"码畜").start();new Thread(web,"码农").start();new Thread(web,"码蟥").start();;}}class SynWeb12306 implements Runnable{//票数private int ticketNums =10;private boolean flag = true;@Overridepublic void run() {while(flag) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}test5();}} //线程安全:尽可能锁定合理的范围(不是指代码 指数据的完整性)//double checkingpublic void test5() {if(ticketNums<=0) {//考虑的是没有票的情况flag = false;return ;}synchronized(this) { if(ticketNums<=0) {//考虑最后的1张票flag = false;return ;}//模拟延时try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);}}//线程不安全 范围太小锁不住public void test4() {synchronized(this) {if(ticketNums<=0) {flag = false;return ;}}//模拟延时try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);}//线程不安全 ticketNums对象在变 锁的应该是地址,锁的应该是不变的东西public void test3() {synchronized((Integer)ticketNums) {if(ticketNums<=0) {flag = false;return ;}//模拟延时try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);}}//线程安全 范围太大 -->效率低下public void test2() {//用this没有问题,因为把对象给锁定啦! 要锁ticketNums和flag 这两个变量,只有这两个锁住啦,才是真的锁住啦synchronized(this) {if(ticketNums<=0) {flag = false;return ;}//模拟延时try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);}}//线程安全 同步public synchronized void test1() {if(ticketNums<=0) {flag = false;return ;}//模拟延时try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName()+"-->"+ticketNums--);}
}
快乐影院 订票操作
/*** 快乐影院* @author Administrator**/
public class HappyCinema {public static void main(String[] args) {Cinema c=new Cinema(1,"happy dym");new Thread(new Customer(c, 2),"止兮").start();new Thread(new Customer(c, 1),"苍凌").start();}
}
//顾客
class Customer implements Runnable{Cinema cinema;int seats;public Customer(Cinema cinema, int seats) {super();this.cinema = cinema;this.seats = seats;}@Overridepublic void run() {synchronized(cinema) {boolean flag=cinema.bookTickets(seats);if(flag) {System.out.println("出票成功"+Thread.currentThread().getName()+"->票数为:"+seats);}else {System.out.println("出票失败"+Thread.currentThread().getName()+"->位置不够");}}}}//影院
class Cinema{int available; //可用的位置个数String name; //名称public Cinema(int available, String name) {super();this.available = available;this.name = name;}//购票public boolean bookTickets(int seats) {System.out.println("可用的位置个数为:"+available);if(seats>available) {return false;}available -= seats;return true;}
}
快乐影院 订票操作 改良版
import java.util.ArrayList;
import java.util.List;/*** 快乐影院* @author Administrator**/
public class HappyCinema2 {public static void main(String[] args) {//可用位置List<Integer> available=new ArrayList<Integer>();available.add(1);available.add(3);available.add(4);available.add(5);available.add(6);available.add(9);//顾客需要的位置List<Integer> seat1=new ArrayList<Integer>();seat1.add(1);seat1.add(2);List<Integer> seat2=new ArrayList<Integer>();seat2.add(3);seat2.add(5);seat2.add(9);DymCinema d=new DymCinema(available, "happy dym");new Thread(new HappyCustomer(d, seat1),"止兮").start();new Thread(new HappyCustomer(d, seat2),"苍凌").start();}
}
//顾客
class HappyCustomer implements Runnable{DymCinema cinema;List<Integer> seats;public HappyCustomer(DymCinema cinema, List<Integer> seats) {this.cinema = cinema;this.seats = seats;}@Overridepublic void run() {synchronized(cinema) {boolean flag=cinema.bookTickets(seats);if(flag) {System.out.println("出票成功"+Thread.currentThread().getName()+"-<位置为:"+seats);}else {System.out.println("出票失败"+Thread.currentThread().getName()+"-<位置不够"); }}}}//影院
class DymCinema{List<Integer> available; //可用的位置String name; //名称public DymCinema(List<Integer> available, String name) {this.available = available;this.name = name;}//购票public boolean bookTickets(List<Integer> seats) {System.out.println("欢迎光临"+this.name+",当前的可用位置为:"+available);List<Integer> copy=new ArrayList<Integer>();copy.addAll(available);//相减copy.removeAll(seats);//判断大小if(available.size()-copy.size()!=seats.size()) {return false;}//订票成功available=copy;return true; }
}
快乐火车票
/*** 快乐火车票* @author Administrator**/
public class Happy12306 {public static void main(String[] args) {Web12306 c=new Web12306(4,"happy dym");new Passenger(c,"止兮",2).start();new Passenger(c,"苍凌",1).start();}
}
//顾客
class Passenger extends Thread{int seats;public Passenger(Runnable target,String name,int seats) {super(target,name);this.seats=seats;}
}
// 火车票网
class Web12306 implements Runnable{int available;//可用的位置String name; //名称public Web12306(int available, String name) {this.available = available;this.name = name;}@Overridepublic void run() {Passenger p=(Passenger)Thread.currentThread();boolean flag=this.bookTickests(p.seats);if(flag) {System.out.println("出票成功"+Thread.currentThread().getName()+"->订位置的个数:"+p.seats);}else {System.out.println("出票失败"+Thread.currentThread().getName()+"->位置不够");}}//购票public synchronized boolean bookTickests(int seats) {System.out.println("可用位置个数为"+available);if(seats>available) {return false;}available -= seats;return true;}}
操作并发容器
import java.util.concurrent.CopyOnWriteArrayList;
/*** 线程安全:操作并发容器* @author Administrator**/
public class SynContainer {public static void main(String[] args) throws InterruptedException {CopyOnWriteArrayList<String> list=new CopyOnWriteArrayList<String> ();for(int i=0;i<10000;i++) {new Thread(()->{list.add(Thread.currentThread().getName());}) .start();}Thread.sleep(1000);System.out.println(list.size());}
}
java的知识点32——多线程 并发同步的 性能分析、快乐影院 订票操作相关推荐
- (四)Java中的多线程之间实现同步+多线程并发同步
一.什么是线程安全问题 为什么有线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作(修改变量值)时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作时不会发生数据冲突问题. ...
- Java面试知识点:多线程
问题:Java面试知识点:多线程 答案: 1.线程 代码如下: package com.xy;/*** @ProjectName: day01* @Package: com.xy* @ClassNam ...
- Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍
1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...
- 过程 线 多线程 并发 同步异步
过程 线 多线程 并发 同步异步 好多人的过程,线,多线程,并发,同步,异步概念混淆,这不是一个好大学讲学的缘故啊.在这里,我们感受到的概念,帮助学生感受审查困惑. 计划 用来描述个别功能程序中描述的 ...
- java多线程问题_【java 多线程】多线程并发同步问题及解决方法
一.线程并发同步概念 线程同步其核心就在于一个"同".所谓"同"就是协同.协助.配合,"同步"就是协同步调昨,也就是按照预定的先后顺序进行运 ...
- java线程钥匙_Java多线程并发编程/锁的理解
一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...
- 网易云课堂微专业--Java高级开发工程师--多线程并发编程--学习笔记(二)
文章目录 第一章 多线程并发编程 第二节 线程安全问题 1.2.1 线程安全之可见性问题 多线程中的问题 从内存结构到内存模型 工作内存缓存 指令重排序 内存模型的含义 Shared Variable ...
- SSM实现的影院订票系统-JAVA【数据库设计、源码、开题报告】
1绪论 1.1项目开发背景及意义 随着互联网和电子商务的快速发展,网上购物已经成为了现代人生活的一种方式.如今,淘宝.天猫.京东商城.当当网.聚美优品等一系列的电子商务网站更是把网上购物推向了这个时代 ...
- Java面试知识点总结③——多线程和并发
大纲 [x] 一.Java基础(语言.集合框架.OOP.设计模式等) [x] 二.Java高级(JavaEE.框架.服务器.工具等) [x] 三.多线程和并发 [x] 四.Java虚拟机 [x] 五. ...
最新文章
- 图像形态学(opencv),运行后通过在屏幕上输入对应指令完成相对应的形态学方法。
- mysql 冷热数据分离_elasticsearch冷热数据读写分离
- 软件构造第三章 第五部分
- Native与H5交互的一些解决方法
- 深入理解Kafka(4)-主题与分区
- Windows环境下smarty安装简明教程
- 最暖数据: 除夕有6.88亿人用微信红包传递狗年祝福
- 算法题存档20200627(树)
- Scrum 敏捷项目管理
- 一文读懂5G专网发展现状与挑战
- EGO Planner代码解析bspline_optimizer部分(3)
- 分布式session解决方案
- 你有哪些“相见恨晚”的UE4学习资料?
- VMX(2) -- VMCS理解
- 微信开发上传视频到服务器,微信小程序中实现上传视频的开发代码
- px、em 和 rem 三者区别
- PTA L1-039 古风排版
- 【5G网络基础,熟知即可】
- 认知觉醒-2.元认知
- 【Arduino】控制A4950的循迹小车设计