java之synchronized 多线程同步

     今天学习了java关于多线程同步方面的知识,老师出了一个题目: 假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒买一张票。打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。

   其实我觉得这些很简单,可是在这个问题上还是遇到了许多的问题。关键在于对synchronized关键字的理解,之前还是很肤浅的。从这些我可以发现,学习一门编程语言,实践很重要,一定要把一些知识点应用到代码中这样才会深刻。

     代码中只有两个类(也就两个文件),复制如下:(当作一个教训,以后别再放如此错误。)

文件:TrainTicket.java

package com.homework.threadandexception;

class TrainTicket {

	private int tickets = 0;//当前余票:默认为零.
	private final int initTickets;//初始化时所具有的票数

	/**
	 * <p>无参构造函数.</p>
	 */
	public TrainTicket(){
		this.initTickets = 0;
	}

	/**
	 * <p>构造函数.</p>
	 * @param tickets 初始化时的票数
	 */
	public TrainTicket(int tickets){
		this.initTickets = tickets;
		this.tickets = tickets;
	}

	/**
	 * <p>卖票操作.</p>
	 */
	public void sellTicket(){
		tickets--;
	}

	/**
	 * @return 返回当前的余票数目.
	 */
	public int getTicket(){
		return tickets;
	}

	/**
	 * @return 返回当前卖票操作的索引次序.
	 */
	public int indexTicket(){
		return initTickets - tickets;
	}
}

 文件:TrainTicketRunnable.java

package com.homework.threadandexception;

public class TrainTicketRunnable implements Runnable{

	TrainTicket trainTicket = new TrainTicket(1000);

	@Override
	public void run(){
		while(true){
			synchronized(this){
				//判断是否有余票
				if(trainTicket.getTicket() <= 0){
					break;
				}

				//卖票
				trainTicket.sellTicket();

				//输出操作信息
				System.out.println("第" + Thread.currentThread().getName() +
						"售票点卖出第" + trainTicket.indexTicket() + "张票");

				//等待时间100毫秒.
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}//end try-catch()
			}//end synchronized()
		}//end while()
	}

	/**
	 * <p>应用程序入口:仅限测试.</p>
	 * @param args
	 */
	public static void main(String[] args) {
		TrainTicketRunnable TTR = new TrainTicketRunnable();
		for(int i = 0;i < 10;i++){
			new Thread(TTR,String.valueOf(i + 1)).start();
		}
	}
}

 

你可能感兴趣的:(java,synchronized)