java 多线程 线程安全问题

public class Main  {
	/**
	 * 需求:100张票   通过4个窗口卖完
	 * 
	 * * 多线程并发操作同一数据时, 就有可能出现线程安全问题
	 * 使用同步技术可以解决这种问题, 把操作数据的代码进行同步, 不要多个线程一起操作
	 */
	public static void main(String[] args) {
		TicketSeller t1 = new TicketSeller();
		TicketSeller t2 = new TicketSeller();
		TicketSeller t3 = new TicketSeller();
		TicketSeller t4 = new TicketSeller();
		t1.setName("窗口1");
		t2.setName("窗口2");
		t3.setName("窗口3");
		t4.setName("窗口4");
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		
	}
}

class TicketSeller extends Thread{
	private static int ticket = 100;//如果实现Runnable接口,就不用定义成static
	//private static Object o = new Object();//如果用成员变量当作锁对象,必须是静态的
	
	public TicketSeller() {
		
	}

	public TicketSeller(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void run() {
		while(true) {
			synchronized (TicketSeller.class) {//唯一!
				if(ticket <= 0) {
					break;
				}
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println(getName() + ":剩余票数:" + ticket--);
			}
			
		}
	}
	
}

猜你喜欢

转载自blog.csdn.net/pastthewind/article/details/80212615