一个线程持有锁时,当其他线程尝试获取该锁时,会被阻塞;而这个线程尝试获取自己持有锁时,如果成功说明该锁是可重入的,反之则不可重入。
两者最大的区别就是synchronized是Java内置的关键字,是原生语法层面的互斥,是JVM层面的同步机制。而ReentrantLock是JDK5之后提供的API层面的互斥锁,需要lock(),unlock()方法结合try/finally语句实现。
乐观锁认为对一个对象的操作不会引发冲突,所以每次操作都不进行加锁,只是在最后提交更改时验证是否发生冲突,如果冲突则再试一遍,直至成功为止,这个尝试的过程称为自旋。也可能产生自旋次数过多问题,此时并不能提高效率,反而不如直接加锁的效率高;
主内存和工作内存之间的交互分为8个原子操作:- lock - unlock - read - load - assign - use - store - write - volatile修饰的变量,只有对volatile进行assign操作,才可以load,只有load...
yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。 因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。 但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。