【百思不得琪姐】来大神解疑synchronized(this)/(.class)区别

三爽劈壹仟 2016-03-27 05:26:20
最近看到线程,然后跟着示例写了卖票小程序,然后问题来了,上代码

public class TicketSellByExtendsThread
{

public static void main(String[] args)
{
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();

t1.start();
t2.start();
t3.start();
t4.start();
}

}

class Ticket extends Thread
{
private static int ticket = 100;

@Override
public void run()
{
synchronized (this)
{
while (ticket >= 0)
{
System.out.println("No." + (101 - ticket) + " ticket has been sell");
ticket--;
System.out.println("Tickets remain:" + ticket);
System.out.println();
}
}
}
}


如上,如果是synchronized(this)结果如下,票是不会重复卖,但是打印语句是乱的


改成synchronized(Ticket.class)就正常了,求解为何?
...全文
325 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Teddypedia 2019-01-12
  • 打赏
  • 举报
回复
class会锁住该类产生的所有对象,而this只是锁住当前访问对象
NothingSerious2811 2016-04-02
  • 打赏
  • 举报
回复
引用 3 楼 rickylin86 的回复:
当你调用synchronized(this)的时候实际上每个线程同步的对象都是自身,也就是同步不是建立在同个对象的基础上的.所以自然没办法获得同步的效果.其结果应该是输出每个线程的ticket会从0直至100,并且线程间是交叉的. 如果你用synchronized(Ticket.class)来进行同步.那么每个现在针对同一个对象进行同步.同一个时间只能有一个线程在进行.也是会输出所有ticket从0-100.但是这就要看这是否是你想要的结果.如果是你模拟多个窗口售票的话显然这也不是对的结果
他说的对,就是说的让人不太好理解
NothingSerious2811 2016-04-02
  • 打赏
  • 举报
回复 1
没有好的回答你为啥要结贴,你锁this的时候,你自己想想,你new了四个ticket,相当于你锁了四个不同的this <相当于每个ticket都有自己的锁,根本不是互斥的。你把this,换了,换成一个唯一的对象。 可以在ticket这个类里,定义一个static 的对象。比如,static Animal a=new Animal(); 然后 把你那个锁着的this ,换成a;就可以了,因为你new 再多的ticket();这个静态的a是唯一的,也就是说,锁只有一把
yuenghao 2016-03-27
  • 打赏
  • 举报
回复
synchronized (this)锁的是对象,而synchronized(Ticket.class)锁的是类
rickylin86 2016-03-27
  • 打赏
  • 举报
回复
当你调用synchronized(this)的时候实际上每个线程同步的对象都是自身,也就是同步不是建立在同个对象的基础上的.所以自然没办法获得同步的效果.其结果应该是输出每个线程的ticket会从0直至100,并且线程间是交叉的. 如果你用synchronized(Ticket.class)来进行同步.那么每个现在针对同一个对象进行同步.同一个时间只能有一个线程在进行.也是会输出所有ticket从0-100.但是这就要看这是否是你想要的结果.如果是你模拟多个窗口售票的话显然这也不是对的结果
NothingSerious2811 2016-03-27
  • 打赏
  • 举报
回复
最好把线程分开写,这样看着不好理解容易理解错误。
NothingSerious2811 2016-03-27
  • 打赏
  • 举报
回复
this.tickets不是this

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧