黑马程序员技术交流社区
标题:
多线程,静态同步锁的问题
[打印本页]
作者:
罗正荣
时间:
2013-2-27 22:45
标题:
多线程,静态同步锁的问题
本帖最后由 罗正荣 于 2013-2-28 21:22 编辑
class Ticket implements Runnable
{
private static int tick = 100;
boolean flag = true;
public void run()
{
if(flag)
{
while(true)
{
synchronized(Ticket.class)
{
if(tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....code : "+ tick--);
}
}
}
}
else
while(true)
show();//这里应该是省略了Ticket.这样才能起到同步的作用,但是我感觉这个
//show难道不是对象在调用吗?为什么是Ticket类在调用呢?
}
public static synchronized void show()
{
if(tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....show.... : "+ tick--);
}
}
}
public class StaticMethodDemo
{
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 = false;
t2.start();
}
}
复制代码
问题就是代码中的注释?求解
作者:
莫嘉伟
时间:
2013-2-27 22:58
本帖最后由 莫嘉伟 于 2013-2-27 23:02 编辑
show有static修饰啊,是类方法啊可以用Ticket类直接调用,,顺便说一下,用对象调用其实也是可以的,不过用类也可以,还有的话因为这个是类方法,是属于类的,所有对象共享的,你用该类的任何对象去调用它会出来一样的结果,因为这些类的实例实际上还是通过类本身去调用它。
作者:
余善航
时间:
2013-2-28 18:47
因为你11行锁的对象为类名.class ,show()方法为静态方法,该方法也是类名.class锁 这样是同步的
而用对象调用show()方法,为一个对象锁,
一个用对象锁,一个为类名.class 锁 锁不同,起不到同步的作用
作者:
罗正荣
时间:
2013-2-28 21:21
莫嘉伟 发表于 2013-2-27 22:58
show有static修饰啊,是类方法啊可以用Ticket类直接调用,,顺便说一下,用对象调用其实也是可以的,不过用 ...
谢谢:handshake
作者:
HM王琦
时间:
2013-2-28 23:06
public static synchronized void show()这里show()是Ticketl类的同步静态函数,处于类的成员位置,可以用类名直接调用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2