黑马程序员技术交流社区
标题:
线程问题
[打印本页]
作者:
李道福
时间:
2013-4-4 10:49
标题:
线程问题
本帖最后由 李道福 于 2013-4-4 21:13 编辑
class Ticket4 implements Runnable
{
private int tick = 100;
private boolean flag=true;
Object obj = new Object();
public void run()
{
while(true)
{
if(flag)
synchronized(obj)
{
if(tick>0)
{
System.out.println("-obj-"+Thread.currentThread().getName()+"---");
System.out.println("Ticket:"+tick--);
flag=false;
}
}else
show();
}
}
public synchronized void show(){
if(tick>0){
System.out.println("-show-"+Thread.currentThread().getName()+"---");
System.out.println("Ticket:"+tick--);
flag=true;
}
}
}
class TestTicket4
{
public static void main(String[] args)
{
Ticket4 t = new Ticket4();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
这个代码有什么问题嘛?所有的线程都是在执行时都是同一把锁,为什么在输出时还会输出0;并且输出的结果也不是按我想的那样同步代码块和同步方法
互换依次输出?
复制代码
作者:
随便
时间:
2013-4-4 11:04
run(){
synchronized (this) {}//改成这样就行了。
}
首先你的问题是你没有完全明白synchronized的原理。
必须是同一个锁对象的时候才能得到你预想的结果。
你的
public synchronized void show();使用的锁对象其实是该对象,this.
而 synchronized(obj){}使用的锁对象是Object的一个对象。所以你这样等于没有起到你想要的作用。
另外给你总结几个,
synchronized(this){}等同于public synchronized void method();
synchronized(类名.class) 等同于public static synchronized void method();
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2