黑马程序员技术交流社区
标题:
java 多线程问题
[打印本页]
作者:
ying
时间:
2013-1-6 21:45
标题:
java 多线程问题
本帖最后由 ying 于 2013-1-8 13:15 编辑
我的这个程序使用了同步函数和同步代码块,为啥还打印出0呢?
class Ticket implements Runnable
{
private int tick = 100;
Object obj = new Object();
boolean flag = true;
public void run()
{
if(flag)
{
while(true)
{
this.flag = false;
synchronized(obj)
{
if(tick > 0)
{
try{
Thread.sleep(100);
}catch(Exception e)
{
}
System.out.println(Thread.currentThread().getName() + " code.... " + tick-- );
}
}
}
}
else
while(true)
show();
}
public synchronized void show()
{
if(tick>0)
{
try{
Thread.sleep(100);
}catch(Exception e)
{
}
System.out.println(Thread.currentThread().getName() + " show.... " + tick-- );
}
}
}
class TicketDemo2
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t); //创建一个线程
Thread t2 = new Thread(t); //创建一个线程
t1.start();
t2.start();
}
}
复制代码
作者:
熊永标
时间:
2013-1-6 22:24
package demo1;
class Ticket implements Runnable
{
private int tick = 100;
Object obj = new Object();
boolean flag = true;
public void run()
{
if(flag)
{
while(true)
{
this.flag = false;
synchronized([color=Red]obj[/color])
{
if(tick > 0)
{
try{
Thread.sleep(100);
}catch(Exception e)
{
}
System.out.println(Thread.currentThread().getName() + " code.... " + tick-- );
}
}
}
}
else
while(true)
show();
}
public [color=Red]synchronized[/color] void show()
{
if(tick>0)
{
try{
Thread.sleep(100);
}catch(Exception e)
{
}
System.out.println(Thread.currentThread().getName() + " show.... " + tick-- );
}
}
}
class TicketDemo2
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t); //创建一个线程
Thread t2 = new Thread(t); //创建一个线程
t1.start();
t2.start();
}
}
复制代码
用的不是同一个锁,方法同步用的this,而同步代码块用的却是obj,所以打出了0
作者:
张敬培
时间:
2013-1-6 23:07
当线程运行到sleep(100)时,该线程已经获得了这时的tick,这时该线程sleep释放了当前线程,开始执行另一个线程,当sleep完成后继续执行没有执行完的代码。等到倒数第二个线程时,获得了tick=1,开始sleep,这时最后一个线程判断tick仍然等于1,就开始执行并sleep,这时倒数第二个线程结束sleep,执行tick--,等到最后一个线程结束sleep后,获得的tick就是0了,所以打印出来的是0。
这段代码的while是个死循环,应该在if(tick>0)为假时,跳出这个while循环
作者:
周超
时间:
2013-1-7 00:49
synchronized的锁用的是 obj 同步函数用的是 this 用的锁不同 要实现同步需实现2个步骤:1至少2个线程以上;2需要同一把锁
作者:
ying
时间:
2013-1-7 08:52
嗯! 多谢诸位!:handshake
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2