多线程学习2,买火车票,并解决同步安全的问题

 

会出现的同步安全的问题

/**
 * <pre>
 * 实现Runnable接口来买票 
 * 但是会出现0,-1,-2的同步安全的问题
 * </pre>
 */
public class Ticket implements Runnable {

	private int ticket = 100;
	
	public void run() {
		while (true) {
			if (ticket > 0) {
				try {Thread.sleep(10);} catch (Exception e) {e.printStackTrace();}
				System.out.println(Thread.currentThread().getName() + "..sale:" + ticket--);
			}
		}
	}

	public static void main(String[] args) {
		Ticket t = new Ticket();

		Thread t1 = new Thread(t);// 创建了一个线程;
		Thread t2 = new Thread(t);// 创建了一个线程;
		Thread t3 = new Thread(t);// 创建了一个线程;
		Thread t4 = new Thread(t);// 创建了一个线程;
		t1.start();
		t2.start();
		t3.start();
		t4.start();

	}

}


 

解决了出现的同步安全的问题

/**
 * <pre>
 * 实现Runnable接口来买票 
 * 解决了出现的0,-1,-2的同步安全的问题
 * </pre>
 */
public class Ticket2 implements Runnable {

	private int tick = 100;
	Object obj = new Object();

	public void run() {
		while (true) {
			synchronized (obj) {
				if (tick > 0) {
					try {Thread.sleep(10);} catch (Exception e) {e.printStackTrace();}
					System.out.println(Thread.currentThread().getName() + "....sale : " + tick--);
				}
			}
		}
	}

	public static void main(String[] args) {

		Ticket2 t = new Ticket2();

		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		Thread t3 = new Thread(t);
		Thread t4 = new Thread(t);
		t1.start();
		t2.start();
		t3.start();
		t4.start();

	}
}


下面是错误的用法

/**
 * <pre>
 * 实现 extends Thread类来买票 
 * 会出现线程状态异常的问题
 * 因为一个线程启动(调用start方法)之后,不能再次或多次启动(调用start方法)
 * 
 * 所以本例子的写法是错误的
 * </pre>
 */
public class Ticket3 extends Thread {

	private int ticket = 100;

	public void run() {
		while (true) {
			if (ticket > 0) {
				try {
					Thread.sleep(10);
				} catch (Exception e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName() + "..sale:" + ticket--);
			}
		}
	}

	public static void main(String[] args) {
		
		/* 

		 //因为是共享ticket的100张票,所以下面的方法则产生400张票,明显是不对的
		 Ticket t2 = new Ticket();
		 Ticket t4 = new Ticket();
		 Ticket t5 = new Ticket();
		t2.start();
		t3.start();
		t4.start();
		t5.start();		
		*/
		
		/*
		
		//因为一个线程启动(调用start方法)之后,不能再次或多次启动(调用start方法)
		//报线程状态异常(IllegalThreadStateException)的问题

		Ticket3 t3 = new Ticket3();
		t3.start();
		t3.start();
		t3.start();
		t3.start();
		 */
		
	}

}


 

你可能感兴趣的:(多线程学习2,买火车票,并解决同步安全的问题)