并发编程——线程中并发安全

100 阅读2分钟

1.synchronized关键字的底层原理

难易程度:5

出现频率:3

1)synchronized【对象锁】采用互斥的方式让同一时刻至多只有一个线程能持有【对象锁】,其他线程再想获取这个【对象锁】时就会阻塞住。

2)它的底层由moniter实现,monitor是jvm级别的对象(C++实现),线程获得锁需要使用对象(锁)关联monitor

3)在monitor内部有3个属性,分别是owner、entrylist、waitset

4)其中owner是关联的获得锁的线程,并且只能关联一个线程;entrylist关联的是处于阻塞状态的线程;waitset关联的是处于Waiting状态的线程。

2.synchronized关键字的底层原理(进阶)

moniter实现的锁属于重量级锁,里面涉及到了用户态和内核态的切换、进程的上下文切换,成本较高,性能比较低。 在jdk1.6引入了两种新型锁机制:偏向锁和轻量级锁,它们的引入是为了解决在没有多线程竞争或基本没有竞争的场景下因使用传统锁机制带来的性能开销问题。

monitor实现的锁属于重量级锁,你了解过锁升级吗?

Java中的synchronized有偏向锁、轻量级锁、重量级锁3种形式,分别对应了锁只被1个线程持有、不同线程交替持有锁、多线程竞争锁三种情况。

image.png

3.synchronized和lock有什么区别?

难易程度:4

出现频率:4

1)语法层面

synchronized是关键字,源码在jvm中,用c++实现

lock是接口,源码由jdk提供,用Java语言实现

使用synchronized时,退出同步代码块锁会自动释放。而使用lock时,需要手动调用unlock方法释放锁

2)功能层面

二者均属于悲观锁,都具备基本的互斥、同步、锁重入功能

lock提供了许多synchronized不具备的功能,例如公平锁、可打断、可超时、多条件变量

lock有适合不同场景的视线。如reentrantlock、reentrantreadwritelock(读写锁)

3)性能层面

在没有竞争时,synchronized做了很多优化,如偏向锁、轻量级锁,性能不赖

在竞争激烈时,lock的实现通常会提供更好的性能

4.Java程序中怎么保证多线程的执行安全

难易程度:3

出现频率:3

1)原子性 synchronized、lock 2)内存可见性 volatile、sychronized、lock 3)有序性 volatile