本帖最后由 Silvester 于 2014-4-29 09:50 编辑
楼主,你的主函数没错,是我大意了,楼主的Ticket是继承Thread类的,而我本能的认为是Ticket实现了Runnable接口了,抱歉哈,看了楼下的回复自己检查了才反应过来,感谢楼下,共勉!
- public class TicketDemo {
- 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);
-
- t1.start();
- t2.start();
- t3.start();
- }
- }
复制代码
还有同步的问题主要是在同步代码块的地方,synchronized(new Object())这里出问题了,new Object( )不应该放在这个位置,应该在run( )方法之前定义一个Object obj = new Object( );,把obj作为参数传递给synchronized,即synchronized(obj),代码如下,楼主出错的地方主要在我添加注释的地方:
- class Ticket implements Runnable {
- private int tick = 100;
- Object obj = new Object();//注意这里
- public void run() {
- while(true){
- synchronized(obj) {//这里obj直接传入
- if (tick>0) {
- try {
- Thread.sleep(10);
- } catch (Exception e) {
- }
- System.out.println(Thread.currentThread().getName()+"...sale: " + tick--);
- }
- }
- }
- }
- }
复制代码
至于为什么不能在synchronized( )里面直接new Object( ),是因为obj其实是作为互斥信号量(操作系统的一个名词),传入的,只能简单的说,obj当传入的时候不能被改变,要保证其唯一性,才能有效控制安全,也就是楼下所说的同一个锁的问题。
而如果你使用的是synchronized(new Object( ) ),即每次线程调用run( )方法的时候,t1.start()的run()就new Object( ),t2.start()的run()又重新new Object( ),t3.start()的run()第三次new Object( ),如果t1,t2,t3同步的部分使用的obj是三个不同的obj的话,互相之间变不会被影响,也就无法相互牵制,所以要提前定义好obj,让t1,t2,t3的同步代码块使用的是同一个obj。
不知这么解释楼主能否看明白,希望能够对楼主有帮助。 |