java的知识点32——多线程 并发同步的 性能分析、快乐影院 订票操作
生活随笔
收集整理的這篇文章主要介紹了
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——多线程 并发同步的 性能分析、快乐影院 订票操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机网络知识点4——计算机网络性能
- 下一篇: java的知识点33——死锁及解决方案