Java中的线程与锁的一些概念理解

    Java中的线程是基于操作系统的原生线程模型来实现的,因此在调度上是取决于操作系统层面。

    线程和进程间的区别是在

       进程是系统进行资源分配和调度的一个独立单位.

    线程则是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
    理论上说,并发不一定要使用多线程的方式,只不过java中使用了这种形式而已。
    在jdk1.6之后,锁的粒度变细了,体现在java出现了自旋锁、偏向锁、轻量级锁、重量级锁(互斥),自旋锁是在 多处理器的条件下如果多个线程并行执行获取锁,后面请求的线程会进入到一段自旋状态,看持有锁的线程是否很快会释放锁。但是这样会有一个弊端,如果获取锁的线程的执行时间非常长,这样就会浪费等待时间以及处理器资源。因此在这个基础上引入了自适应自旋,就是在自旋的基础上增加一个次数阈值,超过这个阈值线程就会被挂起。如果自旋刚刚成功过,那么就可以允许自旋等待更多次,如果经常不成功则下次会忽略自旋过程。
    后面提到的3种锁是Synchronized的改良后的分级别的锁,偏向锁是线程在第一次获取对象锁的过程中先会用对象的markword(包括哈希码、GC分代年龄,方法区对象类型的指针以及数组长度)记录一下线程的ID,等到下次再来的时候可以不用进行同步。这种锁在存在竞争的时候会升级到轻量级锁,首先其它线程的竞争会使该对象的状态变更为未锁定状态或者轻量级锁状态。
    在未锁定的状态下,虚拟机会在当前线程的栈帧中建立一个锁记录并将该对象的markword存入,然后尝试将对象的markword更新为该锁记录的指针,如果成功则将对象的锁状态变成轻量级锁状态,如果失败了会检查是否是当前线程占有该锁,如果是则直接执行同步块,否则意味着这个锁对象被其他线程抢占了。若是有两个以上的线程争用一个锁,则锁又会升级,变成重量级锁。

    

猜你喜欢

转载自blog.csdn.net/qq_36243399/article/details/80212409