我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:2019跑狗图高清彩图 > 争用 >

java 线程同步的问题为什么有时不能用synchronized(){}同步块命

归档日期:07-21       文本归类:争用      文章编辑:爱尚语录

  为什么第四行的地方不用加synchronized(){}这样的命令!!!!难道不存在线程争用ticket的问题吗?

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  6848获赞数:11167没有做不到,只有想不到,帮助别人的同时也是对自己的提升向TA提问展开全部你那个加了也没有意义,因为你把synchronized加在线程的代码上了你的线程却new了很多个,并没有线程争用

  怎么没有线程争用?new了很多个,但是都共享一个ticket啊!不信你运行下试试??

  展开全部看书的时候有一句话挺好的,我们应该解决错误而不是降低错误的发生概率。虽然是几年前的问题,但是解答里面就一个说中了,其他都不知道在说些什么,或许是我段位太低了吧。你sleep一下当前线程就会发现错误了。while (ticket 0) {try {

  1.java程序运行时有6种地方存储数据,分别是:寄存器、栈、堆、静态存储、常量存储、

  3.栈的优势是:存取速度比堆要快,仅次于直接位于cpu中的寄存器;栈数据可以共享。

  自动收走这些不再使用的数据,缺点是由于要在运行时动态分配内存,存取速度较慢。

  boolean,(基本数据类型中并没有String的基本类型)。这种类型如int=3的形式来定义,

  称为自动变量。自动变量存在的是字面值,即不是类的实例,也不是类的引用。a是一个指向

  int类型的引用,指向3这个字面值。这些字面值的数据由于大小可知,生存期可知

  如需要定义inta=3;intb=3;这两个自动变量。编译器先处理inta=3;

  首先在栈中创建一个变量为a的引用,然后查找栈有没有字面值为3的引用,没有找到,

  接着处理intb=3;在创建完b这个引用变量后,由于在栈中已经有了3这个字面值,

  重新开辟地址存放4的值。如果已经有就直接将a指向这个地址,因此a的值改变不会影响b的值。

  声明对象的引用和对象的实例化。声明一个对象引用时,将在栈内存为对象的引用变量分配空间

  ;对象实例化是,在堆内存中为类成员变量分配内存,并将其初始化为各数据类型默认值,

  接着进行显示初始化,最后调用构造方法为成员变量赋值,返回堆内存中对象的引用

  8.包装类数据的存储:基本数据类型的定义都是直接在栈中,如果是包装类型来创建对象,

  9.string数据类型是一种特殊数据类型,既可以用基本数据类型格式来创建,

  追问你说的我知道,即使改成Integer 我还是问同样的问题,为什么不需要要加synchronized(ticket){} 也就是为什么不加这个也能得出正确的结果??

  对象锁,私有锁方式中,ticket必须是对象,且不能是int、long等基本类型,也不能是基本类型的包装类。原因是Java的自动封箱和解箱操作在作怪。这里的ticket--实际上是ticket = new Integer(ticket-1),所以执行完ticket--后,ticket已经不是原来的对象了,同步块自然就无效了

本文链接:http://textandcandy.com/zhengyong/298.html