作者回复: 回答很好,赞一个。
作者回复: notify()可以结合wait(long)方法使用,解决某些没有通知的线程被通知不到的问题
作者回复: 回答很好。线程进入阻塞,两者都会发生进程上下文切换。Synchronized中阻塞线程无论何时去获取锁,都需要进入到内核态,而AQS中,阻塞线程再次获取锁时,是通过state以及CAS操作判断,只有没有竞争成功时,才会再次被挂起,这样可以尽量减少上下文切换。
作者回复: volatile主要是用来保证共享变量额可见性,以及防止指令重排序,保证执行的有序性。
通过生成.class文件之后,反编译文件我们可以看到通过volatile修饰的共享变量,在写入操作的时候会多一个Lock前缀这样的指令,当操作系统执行时会由于这个指令,将当前处理器缓存的数据写回系统内存中,并通知其他处理器中的缓存失效。
所以volatile不会带来线程的挂起操作,不会导致上下文切换。
作者回复: 这里的vector是一个对象锁,锁的是一个代码块,并不是保证vector的线程安全。
作者回复: 一样会有,相对同步锁来说,只是减少了用户态和内核态的切换。Lock锁被阻塞的线程再次获取锁时,不会产生进程上下文切换,而synchronized阻塞的线程每次获取锁资源都要通过系统调用内核来完成。
作者回复: 是的
作者回复: AQS挂起是通过LockSupport中的park进入阻塞状态,这个过程也是存在进程上下文切换的。但被阻塞的线程再次获取锁时,不会产生进程上下文切换,而synchronized阻塞的线程每次获取锁资源都要通过系统调用内核来完成,这样就比AQS阻塞的线程更消耗系统资源了。
作者回复: 在事务内加,其实这种情况使用乐观锁来锁库存会性能好一些
作者回复: wait是在锁代码块里面,所以一旦超时,则会跳出该同步锁代码块
作者回复: 进程的上下文切换指的是用户态和内核态的相互切换,后续补上进程的上下文切换。
作者回复: 你好 devin,在第29讲中讲到了具体的优化。
作者回复: 你好DemonLee同学,第一句是偏向锁、轻量级锁、自旋锁以及重量级锁;
第22讲中详细讲解了优化垃圾回收的内容,可以跳过去先了解下。
作者回复: 包括了JDK1.6
作者回复: 是的,这个循环应该放到锁里面。已修正,谢谢提醒。
编辑回复: 同学你好!后面有个锁,不会同时进去remove。如有疑问,可继续留言。