1.用户态到内核态的切换. Java线程与系统的内核原生线程之间是映射关系,避免线程阻塞之后从当前线程到内核态之间的切换代码,引入自旋锁.自旋的意思就是线程不会挂起,而是在无目的自旋状态,以便在获取到执行机会时能够立即执行.
2.可重入锁所解决的问题. 可重入锁是为了避免自身造成的死锁,例如当前对象的A方法的执行在代码块中唤醒B方法,那么B方法只要是属于当前对象,其实是不用去申请锁的,要是在锁中申请线程去调用调用方法会造成自身的死锁现象.
3.CAS操作 CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。 CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。 CAS操作存在的问题:ABA 只能确保一个原子操作 自旋造成的系统开销过大
4.Sychronized为什么不公平? 其并非是按照申请线程的时间分配线程,而是一个锁释放之后任意的线程都能够竞争到锁,目的是提高程序执行的性能,但是会造成线程饥饿现象.
5.CountDownLatch、CyclicBarrier、Semaphore 这上面就是JUC包中非常重要的几个类,其能实现比sync更加灵活强大的功能. CountDownLatch:计数器闭锁,能让当前一个线程或者多个线程等待,知道其他的线程操作完成,比如框架在初始化的时候希望各项功能就位,然后主方法才能正常启动.知道当前计数器的值为0时代表初始化完成.countdown方法.
CyclicBarrier:回环栅栏,其和上面的实现基本一致,但是其是等待所有的线程都达到某个状态之后才开始执行,比如说等初始化十个线程执行任务,线程不够的时候就一直等待知道有足够多的的线程,其可以被重用.其有await方法,调用之后进入判断状态. Semaphore:信号量,可以控制同时访问的线程个数,通过acquire获得一个许可,release释放一个许可.