并发

浅析java锁机制及并发安全

什么是线程安全1、进程与线程2、内存模型JMM1)对象都存储在主内存中。2)每个线程都有自己的独立的工作内存,里面保存该线程需要用到的变量的副本(主内存中该变量的一份拷贝)。3、内存可见性volatile:保证内存可见性,当一个线程修改了变量的值以后,其他线成也能看到这个值。保证可见行、不保证原子性、有序性(禁止指令重排序)。使用场景:作为开关状态变量、双重检查的单例。4、线程安全问题1)线程安全

什么是线程安全

1、进程与线程

2、内存模型JMM

1)对象都存储在主内存中。

2)每个线程都有自己的独立的工作内存,里面保存该线程需要用到的变量的副本(主内存中该变量的一份拷贝)。

3、内存可见性

volatile:保证内存可见性,当一个线程修改了变量的值以后,其他线成也能看到这个值。

保证可见行、不保证原子性、有序性(禁止指令重排序)。

使用场景:作为开关状态变量、双重检查的单例。

4、线程安全问题

1)线程安全

当多个线程访问一个类时,若无需考虑这些线程在运行时环境下的调度和交替执行,并且不需要额外的同步及调用代码不必作其他的协调,这个类的行为仍然是正确的,那么称这个类是线程安全的。线程安全的类封装了必要的同步,客户不需要自己提供。

2)线程安全问题产生原因

多个线程在操作共享数据;操作共享数据的线程代码有多条;

当一个线程在操作共享数据的多条代码时,其他线程进行了共享数据的写操作,导致线程安全问题产生。

02

synchronized锁分析

1、特点

1)基本特点

具有可重入性、非公平性、不可中断性、主动释放、只能绑定一个条件。

可使用于:代码块、方法、类。

2)底层机制

synchronized语句:当源代码被编译成字节码时,会在同步块的入口位置及出口位置分别插入mointorenter和monitorexit字节码指令。

synchronized方法:在class文件的方法表中将该方法的access_flags字段synchronized标志置1。

Jdk1.6之前,mointorenter及monitotexit依赖于操作系统的Mutex Lock来实现,而Mutex Lock需要将线程挂起并从用户态切换到内核台,这个切换过程非常消耗资源。Jdk1.6之后,对synchronized锁进行了大量优化,采用无锁状态、偏向锁、轻量级锁、Mutex Lock锁实现。

2、锁升级

1)Mark word状态变化

2)synchronized几种锁的比较

3、synchronized使用方式

1)Synchonzied同步代码块

2)Synchronized方法

4、synchronize

原创不易,完成人机校验,阅读全文

相关推荐