黑马程序员技术交流社区
标题:
同步代码块的对象问题
[打印本页]
作者:
刘海东
时间:
2013-5-27 09:14
标题:
同步代码块的对象问题
本帖最后由 刘海东 于 2013-5-27 11:18 编辑
在写代码的时候,很自以为是的就想偷懒
就写了对象的简写格式
然后运行结果就出错了
请大家帮我看看
谢谢
public class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();//创建票的对象
Thread t1 = new Thread(t);//创建线程,并把Runnable接口的子类对象传递给Thread的子类对象
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
t1.start();//开启线程
t2.start();
t3.start();
}
}
class Ticket implements Runnable//实现Runnable接口
{
private int num = 100;
<font color="red">//Object obj = new Object();//这里如果是这样写的话,程序运行时不会生成错票</font>
public void run()//复写run方法,把需要被多线程执行的代码写入run方法中
{
while(true)
{
<font color="red">synchronized(new Object())//这里把对象简写的话,就打印错票了,</font>
{
if(num>0)
{
try{Thread.sleep(10);}
catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"...ticket sale..."+num--);
}
}
}
}
}
复制代码
我都试了一下,为什么不能用简写的格式创建对象。难道那个对象被垃圾回收了??????????????
作者:
张俊迪
时间:
2013-5-27 09:22
如果你要是在synchronized中new对象的话是不是你们每次判断锁的时候都会生成一个对象,那么就会生成多个锁,只要判断就会生成一个锁,而同步的时候是能有一个锁
作者:
lpflpy
时间:
2013-5-27 09:43
你直接用synchronized(new Object());这样的话,每个线程进来都会重新创建一个新的对象,违背了锁的对象必须是同一个的原则,当然会出错了。
作者:
黄丽军
时间:
2013-5-27 09:54
每次都生成了新”锁“吧,所有线程应该用同一个锁。
作者:
曹德君
时间:
2013-5-27 11:11
package cm.nti56;
public class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();//创建票的对象
/* Thread t1 = new Thread(t);//创建线程,并把Runnable接口的子类对象传递给Thread的子类对象
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
t1.start();//开启线程
t2.start();
t3.start();*/
//开启线程
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class Ticket implements Runnable//实现Runnable接口
{
private int num = 100;
//创建同步锁,要在while循环前创建不然会创建很多不同的实例对象,那样就是多个锁了。
Object obj = new Object();
public void run()//复写run方法,把需要被多线程执行的代码写入run方法中
{
while(true)
{
synchronized(obj)
{
if(num>0)
{
try{Thread.sleep(10);}
catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"...ticket sale..."+num--);
} }
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2