JVM-----互斥同步

1、同步:指多个线程并发访问共享数据时,保证共享数据在同一个时刻只被一个(或者是一些,使用信号量的时候)线程使用。

2、互斥:是实现同步的一种手段,临界区、互斥量和信号量都是主要的互斥实现方式。

3、互斥是因,同步是果;互斥是方法,同步是目的。

4、JAVA中实现同步的方式:

(1)synchronized关键字。

(2)重入锁(ReentrantLock)

5、公平锁

(先申请,先得到)多个线程在等待同一个锁时,必须按照申请锁的时间顺序来依次获取,而非公平锁则不保证这一点。synchronized不是公平锁,ReentrantLock默认下也不是公平锁,但是在构造函数中,可以设置为公平的。

6、互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能问题,阻塞或唤醒一个线程,需要从用户态转为核心态,状态转换需要耗费很多的处理器时间。

    为了解决这个问题,提出自旋锁,即如果物理机器有一个以上的处理器,能让两个或两个以上的线程同时并行执行,我们就可以让后面请求锁的那个线程“稍等一下”,但不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁,为了让线程等待,我们只需让线程执行一个忙循环(自旋),这项技术就是所谓的自旋锁。

    自旋等待的时间必须有一定的限度,如果自旋超过了限定的次数仍然没有成功获得锁,就应当使用传统的方式去挂起线程了。自旋次数的默认值是10。

    自适应自旋锁的自旋时间不再固定,而是由前一次在同一个锁上的自旋时间及锁的持有者状态来决定。如果在同一个锁对象上,自旋等待刚刚成功获得锁,并且持有锁的线程正在运行中,那么虚拟机认为这次自旋也很有可能再次成功,所以它将允许自旋等待相对更长的时间,比如100个循环。然而,对于某个锁,自旋很少成功获得过,那再以后要获取这个锁时将可能省略掉自旋过程,以避免浪费处理器资源。

    


猜你喜欢

转载自blog.csdn.net/g1607058603/article/details/80584742