6.18Java多线程并发、同步练习DemoNo1

6.18Java多线程并发、同步练习DemoNo1

不和选择的线程数据安全

package iostudy.synchro;

/**
* 多线程模拟影院选位置
* @since JDK 1.8
* @date 2021/6/18
* @author Lucifer
*/
public class HappyCinema {
   public static void main(String[] args) {

       /*实例化资源类对象*/
       Cinema c = new Cinema(2, "Happy Game!");

       /*实例化代理对象*/
       new Thread(new Customer(c,2), "James").start();
       new Thread(new Customer(c,1), "Harden").start();

  }
}

/**
* 内部资源类,定义资源属性和数量
*/
class Cinema{

   /*定义资源*/
   int available; //可用地位置
   String name; //位置名称

   /*构造器*/
   public Cinema(int available, String name){
       this.available = available;
       this.name = name;
  }

   /*购票方法*/
   public boolean bookTickets(int seats){
       System.out.println("可用位置为:" + available);
       /*逻辑判断*/
       if (seats > available) {
           return false;
      }

       available -= seats;
       return true;

  }
}

/**
* 创建顾客类
*/
class Customer implements Runnable{

   /*传入资源类对象*/
   Cinema cinema;
   int seats;

   /*创建构造器*/
   public Customer(Cinema cinema, int seats){
       this.cinema = cinema;
       this.seats = seats;
  }

   /*重写run方法*/
   @Override
   public void run(){
        /*对影院对象加锁*/
       synchronized (cinema){
           boolean flag = cinema.bookTickets(seats); //传入位置判断是true还是false
           if (true){
               System.out.println("出票成功" + Thread.currentThread().getName()
                       + "位置为:" + seats);
          }else {
               System.out.println("出票失败!!!");
          }
      }
  }
}

使用容器控制,可选择座位号

package iostudy.synchro;

import java.util.ArrayList;
import java.util.List;

/**
* 多线程模拟影院选位置
* 加入可选位置功能--->利用容器实现
* @since JDk 1.8
* @date 2021/6/18
* @author Lucifer
*/
public class HappyCinemaNo2 {
   public static void main(String[] args) {

       /*实例化容器可用的位置*/
       List<Integer> available = new ArrayList<Integer>();

       /*添加资源座位*/
       available.add(1);
       available.add(2);
       available.add(3);
       available.add(6);
       available.add(7);

       //需要的位置--->后期选择底层也是加入容器当中
       List<Integer> seats1 = new ArrayList<Integer>();
       seats1.add(1);
       seats1.add(2);

       List<Integer> seats2 = new ArrayList<Integer>();
       seats2.add(3);
       seats2.add(7);
       seats2.add(6);

       /*实例化资源类*/
       JunCinema j = new JunCinema(available, "HappyCinema");

       /*实例化代理类*/
       new Thread(new HappyCustomer(j, seats1), "JamesWilliam").start();
       new Thread(new HappyCustomer(j, seats2), "JamesHarden").start();
  }
}

/**
* 资源类
*/
class HappyCustomer implements Runnable{

   /*实例化资源对象*/
   JunCinema cinema;
   List<Integer> seats;

   /*创建构造器*/
   public HappyCustomer(JunCinema cinema, List<Integer> seats){
       this.cinema = cinema;
       this.seats = seats;
  }

   /*重写run方法*/
   @Override
   public 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 JunCinema{

   /*创建资源*/
   List<Integer> available;
   String name;

   /*创建构造器*/
   public JunCinema(List<Integer> available, String name){
       this.available = available;
       this.name = name;
  }

   /**
    * 购票选座位方法
    */
   public boolean bookTickets(List<Integer> seats){
       System.out.println("可用位置为:" + available);
       /*两个容器的比较和操作--->做差比较判断是否可以返回*/
       //先拷贝一份原有资源
       List<Integer> copy = new ArrayList<Integer>();
       /*使用copy方法进行添加*/
       copy.addAll(available);

       //使用copy减掉座位
       copy.removeAll(seats); //修改指向
       //判断大小
       /*
       先拷贝位置,然后操作下面的位置
       available大小-copy的大小是否等于seats座位的大小
        */
       if (available.size()-copy.size() != seats.size()){
           /*返回失败*/
           return false;
      }

       //如果成功,直接赋值
       available = copy;

       return true;
  }
}

 

 

posted @ 2021-06-18 19:28  俊king  阅读(105)  评论(0编辑  收藏  举报