黑马程序员技术交流社区
标题:
同步
[打印本页]
作者:
吴通
时间:
2012-8-23 22:06
标题:
同步
class Ticket implements Runnable
{
private int tick=1000; --------------------------------(2).
Object obj=new Object();
boolean flag=true;
public void run()
{
if(flag)
{
while(true)
{
synchronized(obj) // -------------------(1)
{
if(tick>0)
{
try
{
Thread.sleep(10);
}
catch (Exception e)
{
System.out.println("执行");
}
System.out.println(Thread.currentThread().getName()+"....code...."tick--);
}
}
}
}
else
while(true)
show(); //2.那么这是静态方法怎样调用的呢?
}
public synchronized void show() -------------------------------------------(3)
{
if(tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....show...."+tick--);
}
}
}
class TicketDemo3
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread t1=new Thread(t);
Thread t2=new Thread(t);
t1.start();
try{Thread.sleep(10);}catch(Exception e){}
t.flag;
t2.start();
}
}
为什么会打印0?
而如果在(1)处的括号里面改成this就行
而如果把(2)和(3)语句加上static则会出错,而把(1)处换成Ticket.class为什么可以?
详解
作者:
杨鹏鹏
时间:
2012-8-23 23:02
哥们。
为什么会打印0?
而如果在(1)处的括号里面改成this就行?
因为,不是统一的对象锁, t1的对象锁是object,而t2的对象所是this
而如果把(2)和(3)语句加上static则会出错,而把(1)处换成Ticket.class为什么可以?
如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的对象所对应的Class对象,因为Java中无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,他们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始执行。
作者:
吴通
时间:
2012-8-24 20:07
已解决 谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2