多线程  并发  同步  性能分析

/*** 线程安全: 在并发时保证数据的正确性、效率尽可能高* 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——多线程 并发同步的 性能分析、快乐影院  订票操作相关推荐

  1. (四)Java中的多线程之间实现同步+多线程并发同步

    一.什么是线程安全问题 为什么有线程安全问题? 当多个线程同时共享同一个全局变量或静态变量,做写的操作(修改变量值)时,可能会发生数据冲突问题,也就是线程安全问题.但是做读操作时不会发生数据冲突问题. ...

  2. Java面试知识点:多线程

    问题:Java面试知识点:多线程 答案: 1.线程 代码如下: package com.xy;/*** @ProjectName: day01* @Package: com.xy* @ClassNam ...

  3. Java核心知识点学习----多线程中的阻塞队列,ArrayBlockingQueue介绍

    1.什么是阻塞队列? 所谓队列,遵循的是先进先出原则(FIFO),阻塞队列,即是数据共享时,A在写数据时,B想读同一数据,那么就将发生阻塞了. 看一下线程的四种状态,首先是新创建一个线程,然后,通过s ...

  4. 过程 线 多线程 并发 同步异步

    过程 线 多线程 并发 同步异步 好多人的过程,线,多线程,并发,同步,异步概念混淆,这不是一个好大学讲学的缘故啊.在这里,我们感受到的概念,帮助学生感受审查困惑. 计划 用来描述个别功能程序中描述的 ...

  5. java多线程问题_【java 多线程】多线程并发同步问题及解决方法

    一.线程并发同步概念 线程同步其核心就在于一个"同".所谓"同"就是协同.协助.配合,"同步"就是协同步调昨,也就是按照预定的先后顺序进行运 ...

  6. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  7. 网易云课堂微专业--Java高级开发工程师--多线程并发编程--学习笔记(二)

    文章目录 第一章 多线程并发编程 第二节 线程安全问题 1.2.1 线程安全之可见性问题 多线程中的问题 从内存结构到内存模型 工作内存缓存 指令重排序 内存模型的含义 Shared Variable ...

  8. SSM实现的影院订票系统-JAVA【数据库设计、源码、开题报告】

    1绪论 1.1项目开发背景及意义 随着互联网和电子商务的快速发展,网上购物已经成为了现代人生活的一种方式.如今,淘宝.天猫.京东商城.当当网.聚美优品等一系列的电子商务网站更是把网上购物推向了这个时代 ...

  9. Java面试知识点总结③——多线程和并发

    大纲 [x] 一.Java基础(语言.集合框架.OOP.设计模式等) [x] 二.Java高级(JavaEE.框架.服务器.工具等) [x] 三.多线程和并发 [x] 四.Java虚拟机 [x] 五. ...

最新文章

  1. 图像形态学(opencv),运行后通过在屏幕上输入对应指令完成相对应的形态学方法。
  2. mysql 冷热数据分离_elasticsearch冷热数据读写分离
  3. 软件构造第三章 第五部分
  4. Native与H5交互的一些解决方法
  5. 深入理解Kafka(4)-主题与分区
  6. Windows环境下smarty安装简明教程
  7. 最暖数据: 除夕有6.88亿人用微信红包传递狗年祝福
  8. 算法题存档20200627(树)
  9. Scrum 敏捷项目管理
  10. 一文读懂5G专网发展现状与挑战
  11. EGO Planner代码解析bspline_optimizer部分(3)
  12. 分布式session解决方案
  13. 你有哪些“相见恨晚”的UE4学习资料?
  14. VMX(2) -- VMCS理解
  15. 微信开发上传视频到服务器,微信小程序中实现上传视频的开发代码
  16. px、em 和 rem 三者区别
  17. PTA L1-039 古风排版
  18. 【5G网络基础,熟知即可】
  19. 认知觉醒-2.元认知
  20. 【Arduino】控制A4950的循迹小车设计

热门文章

  1. hdu 2005 第几天?(c语言)
  2. 6.1 C/S 架构介绍
  3. script和href
  4. 【Spring】Spring学习笔记-01-入门级实例
  5. 19日零时起降低成品油价格 燃油税元旦起开征
  6. Tree 1.5 For Net 2.0
  7. SEAndroid策略介绍1
  8. Android高通平台调试Camera驱动全纪录
  9. helm滚动更新mysql_kubernetes使用helm滚动更新
  10. 三重for循环优化_MATALB中对循环操作的优化