PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 对对对,这么理解没问题。钥匙就是那个Object对象,就一个,要靠抢的。
作者回复: 不要考虑性能,只要不死锁就不算有问题。新版的JVM已经对synchronized做了很多优化了,当用就用即可。 使用场景就是避免多个线程在同一个对象上执行代码,操作相同的数据,造成数据不一致。 举个简单的例子,同一个银行账户,取钱100和银行的账户余额减少100,程序在进行取钱操作和操作账户余额的操作时,别的线程是不可以操作账户余额的。如果多个线程同时执行这两个操作,没有synchronized保护的情况下,最后可能会数据和取了10次100块钱,结果账户余额只扣了900。 再举个例子,比如说账户里只有100块钱,结果起了100000个线程同时取钱,即使先做检查,再从账户扣钱,再执行取钱操作,还是有很大概率会让取钱操作执行多次的。
作者回复: 问题的关键是,thread1和thread2并非是一个一个轮流执行changData的。可能是t1执行一百万次,然后t2执行300万次。所以最后执行完的那个应该是输出0。而至于顺序问题,确实更大概率是0后面输出,但是概率不是绝对。很可能t1执行完changeData之后,cpu调度让他休息了一会儿,结果被t2后来居上,计算玩并一鼓作气把结果打印出来了。
作者回复: 😁
作者回复: 加了synchronized会排队同步等待。没加的代码可以并行呀
作者回复: 嗯呐,这是jvm层面的优化
作者回复: 锁只能锁住一个对象。如果你说的是锁住Object.class,这个也是Class类的一个对象。
作者回复: 任意对象都可以。重点在于需要同步的地方都在用这同一个锁
作者回复: 是拿这个对象当锁
作者回复: 嗯呐,没有抢到就是等待状态。 * <li>{@link #BLOCKED} * A thread that is blocked waiting for a monitor lock * is in this state. * </li>