未加锁
package study_3;
public class synTest3 {
public static void main(String[] args) {
Cinema cinema = new Cinema(20, "电影院1");
new Thread(new Customer(cinema, 2),"john").start();
new Thread(new Customer(cinema, 1),"alice").start();
}
}
class Cinema{
private int availables;//可用的位置数
private String name;//名称
public Cinema(int availables, String name) {
this.availables = availables;
this.name = name;
}
public boolean bookTickets(int tickets) {
System.out.println("剩余座位" + availables);
if (tickets > availables) {
return false;
}else {
availables -= tickets;
return true;
}
}
}
class Customer implements Runnable{
Cinema cinema;
int seats;
public Customer(Cinema cinema, int seats) {
this.cinema = cinema;
this.seats = seats;
}
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
boolean flag = cinema.bookTickets(seats);
if (flag) {
System.out.println("成功订到电影票" + "------>"+ seats);
}else {
System.out.println("出票失败" + "------>" + "位置不够");
}
}
}
结果
剩余座位20
剩余座位20
成功订到电影票------>2
成功订到电影票------>1
剩余座位都是20,数据不同步
加锁(同步块)
package study_3;
public class synTest3 {
public static void main(String[] args) {
Cinema cinema = new Cinema(20, "电影院1");
new Thread(new Customer(cinema, 13),"john").start();
new Thread(new Customer(cinema, 11),"alice").start();
}
}
class Cinema{
private int availables;//可用的位置数
private String name;//名称
public Cinema(int availables, String name) {
this.availables = availables;
this.name = name;
}
public boolean bookTickets(int tickets) {
System.out.println("剩余座位" + availables);
if (tickets > availables) {
return false;
}else {
availables -= tickets;
return true;
}
}
}
class Customer implements Runnable{
Cinema cinema;
int seats;
public Customer(Cinema cinema, int seats) {
this.cinema = cinema;
this.seats = seats;
}
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (cinema) {
boolean flag = cinema.bookTickets(seats);
if (flag) {
System.out.println("成功订到电影票" + "------>"+ seats);
}else {
System.out.println("出票失败" + "------>" + "位置不够");
}
}
}
}
结果
剩余座位20
成功订到电影票------>13
剩余座位7
出票失败------>位置不够
同步方法
package study_3;
public class synTest3 {
public static void main(String[] args) {
Cinema cinema = new Cinema(20, "电影院1");
new Customer(13,cinema,"john").start();
new Customer(8,cinema,"alice").start();
}
}
class Cinema implements Runnable{
private int availables;//可用的位置数
private String name;//名称
public Cinema(int availables, String name) {
this.availables = availables;
this.name = name;
}
public synchronized boolean bookTickets(int tickets) {
System.out.println("剩余座位" + availables);
if (tickets > availables) {
return false;
}else {
availables -= tickets;
return true;
}
}
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Customer c = (Customer)Thread.currentThread();//子类可以对父类强转
boolean flag = this.bookTickets(c.seats);
if (flag) {
System.out.println("成功订到电影票" + "------>"+ c.seats);
}else {
System.out.println("出票失败" + "------>" + "位置不够");
}
}
}
class Customer extends Thread{
int seats;
public Customer(int seats,Runnable target,String name) {
super(target,name);
this.seats = seats;
}
}
改进,定具体的座位
package study_3;
import java.util.ArrayList;
import java.util.List;
public class synTest3 {
public static void main(String[] args) {
List<Integer> cinemaseats = new ArrayList<Integer>();
cinemaseats.add(1);
cinemaseats.add(3);
cinemaseats.add(4);
cinemaseats.add(5);
cinemaseats.add(6);
Cinema cinema = new Cinema(cinemaseats, "电影院1");
List<Integer> seat1 = new ArrayList<Integer>();
seat1.add(1);
seat1.add(3);
seat1.add(4);
seat1.add(6);
new Thread(new Customer(cinema, seat1),"john").start();
List<Integer> seat2 = new ArrayList<Integer>();
seat2.add(5);
seat2.add(7);
new Thread(new Customer(cinema, seat2),"alice").start();
}
}
class Cinema{
private List<Integer> availables;//可用位置数组
private String name;//名称
public Cinema(List<Integer> availables, String name) {
this.availables = availables;
this.name = name;
}
public boolean bookTickets(List<Integer> tickets) {
System.out.println("剩余座位" + availables);
List<Integer> copy = new ArrayList<Integer>();
copy.addAll(availables);
copy.removeAll(tickets);
if (availables.size() - copy.size() == tickets.size()) {//电影院位置数组的大小-订好座位后电影院数组的大小是够==订的座位数组的大小
availables = copy;
return true;
}else {
return false;
}
}
}
class Customer implements Runnable{
Cinema cinema;
List<Integer> seats;//具体座位数组
public Customer(Cinema cinema, List<Integer> seats) {
this.cinema = cinema;
this.seats = seats;
}
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (cinema) {
boolean flag = cinema.bookTickets(seats);
if (flag) {
System.out.println("成功订到电影票" + "------>"+ seats);
}else {
System.out.println("出票失败" + "------>" + "位置不够");
}
}
}
}
结果
剩余座位[1, 3, 4, 5, 6]
成功订到电影票------>[1, 3, 4, 6]
剩余座位[5]
出票失败------>位置不够