java关于模拟火车卖piao的多线程同步问题

dearLHB 发布于 2016/05/19 16:20
阅读 363
收藏 0

两段代码实现的问题是一样的,模拟火车 piao的多线程同步问题。。

现在的问题是,代码1是本人自己写的,运行发现并不能实现线程同步(synchronized并没有起作用)。问问各位前辈能不能指点我一下,我的代码问题是出在哪里了呢?

ps:代码2是参考别人的。

代码1.


public class TestTicket {

	private static int saled = 0;
	private static int count = 1000;// 总piao数

	public static void main(String[] args) {
		TestTicket test = new TestTicket();
		for (int i = 1; i <= 10; i++) {
			Seller seller1 = test.new Seller(i);
			Thread t1 = new Thread(seller1);
			t1.start();
		}
	}

	class Seller implements Runnable {
		private int n;

		public Seller(int n) {
			this.n = n;
		}

		@Override
		public void run() {
			while (sell(n)) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}

		public synchronized boolean sell(int n) {
			if (saled < count) {
				saled++;
				System.out.println(String.format("第{%s}售 点卖出第[%s]张piao", n, saled));
				return true;
			} else {
				return false;
			}
		}
	}
}
代码2.



public class TestTicket2 {
	private static int k = 0;//  
	private static int count = 1000;// 总piao数

	private static synchronized boolean sell(int n) {
		if (k < count) {
			k++;
			System.out.println("第" + n + "售 点售出第" + k + "张piao");
			return true;
		}
		return false;
	}

	static class SellPot extends Thread { 
		int n;// 

		public SellPot(int n) {
			this.n = n;
		}

		public void run() {
			while (sell(n)) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	public static void main(String[] args) {
		for (int i = 1; i <= 10; i++) {
			new SellPot(i).start();
		}
	}
}









加载中
0
Gillian_Male
Gillian_Male
你的synchronized关键字在非静态方法,锁定是当前对象,而你每次都是new的一个seller对象,相当于对10个seller对象各自加了个锁。所以肯定不能实现线程同步,线程同步的关键是,同步多线程对共享变量控制,前提是你要有共享变量,谢谢
dearLHB
dearLHB
非常感谢,,明白了。。
0
dearLHB
dearLHB
/**
 * 假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒售出一张票。请模拟并打印出售票过程。
 * 注意使用synchronized确保同一张票只能卖出一次。输出格式如下: 第4售票点卖出第100张票 第2售票点卖出第101张票……
 *
 * @author me
 *
 */
0
h
houge
synchronized 方法用的地方不对,新建了多个Seller 对象,锁都在各个对象上
dearLHB
dearLHB
感谢感谢~~非常感谢~~
返回顶部
顶部