synchronize 三大作用、三大用法

简介: synchronize 三大作用、三大用法

synchronize 的三大作用:

1. 原子性:确保线程之间互斥地访问同步代码,每个线程访问期间不会被中断;

2. 可见性:确保共享变量的修改能够被其他线程及时看到,其实是通过 Java 内存模型中的 “对一个变量 unlock 操作之前,先同步到主内存中;如果对一个变量进行 lock 操作,则将会清空工作内存中此变量的值,在其他线程使用此变量前,需要重新从主内存中 load” 来保证的;

3. 有序性:有效解决重排序问题,代码按先后顺序执行,即 “一个 unlock 操作先行发生于后面的线程对同一个锁的 lock 操作”

synchronize 的三大用法:

1. 修饰实例方法:使用当前实例对象作为锁,进入同步代码前要获得当前实例对象的锁。

2. 修饰静态方法:使用当前类作为锁,进入同步代码前要获得当前类对象的锁。

3. 修饰代码块:自己指定加锁对象,可以是对象锁,也可以是类锁,进入同步代码块前要先获得指定的锁。

相关文章
|
2月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
2月前
|
Java C#
C#学习相关系列之多线程(七)---Task的相关属性用法
C#学习相关系列之多线程(七)---Task的相关属性用法
|
3月前
|
存储 安全 Java
【JavaEE初阶】 volatile关键字 与 wait()方法和notify()方法详解
【JavaEE初阶】 volatile关键字 与 wait()方法和notify()方法详解
|
9月前
|
安全 Java 编译器
Volatile关键字的作用和实现原理
Volatile关键字的作用和实现原理
128 0
|
自动驾驶 小程序 Java
wait/notify/notifyAll方法需不需要被包含在synchronized块中?这是为什么?
wait/notify/notifyAll方法需不需要被包含在synchronized块中?这是为什么?
wait/notify/notifyAll方法需不需要被包含在synchronized块中?这是为什么?
|
设计模式 缓存 Java
通过transmittable-thread-local源码理解线程池线程本地变量传递的原理(上)
想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能向预先创建的线程中进行变量传递的局限性,刚好有一位HSBC的技术大牛前同事提到了团队引入了transmittable-thread-local解决了此问题。借着这个契机,顺便clone了transmittable-thread-local源码进行分析,这篇文章会把ThreadLocal和InheritableThreadLocal的局限性分析完毕,并且从一些基本原理以及设计模式的运用分析transmittable-thread-local(下文简称为TTL)整套框架的实现。
123 0
通过transmittable-thread-local源码理解线程池线程本地变量传递的原理(上)
|
设计模式 存储 Prometheus
通过transmittable-thread-local源码理解线程池线程本地变量传递的原理(下)
想起很早之前写过ThreadLocal的源码分析相关文章,里面提到了ThreadLocal存在一个不能向预先创建的线程中进行变量传递的局限性,刚好有一位HSBC的技术大牛前同事提到了团队引入了transmittable-thread-local解决了此问题。借着这个契机,顺便clone了transmittable-thread-local源码进行分析,这篇文章会把ThreadLocal和InheritableThreadLocal的局限性分析完毕,并且从一些基本原理以及设计模式的运用分析transmittable-thread-local(下文简称为TTL)整套框架的实现。
467 0
通过transmittable-thread-local源码理解线程池线程本地变量传递的原理(下)
|
安全 Java
Synchronize 关键字原理
众所周知 Synchronize 关键字是解决并发问题常用解决方案,有以下三种使用方式: 同步普通方法,锁的是当前对象。 同步静态方法,锁的是当前 Class 对象。 同步块,锁的是 {} 中的对象。
|
Java
Java同步关键字synchronize底层实现原理(中)
javap 生成的字节码中包含如下指令: monitorenter monitorexit synchronized基此实现了简单直接的锁的获取和释放。 当JVM的解释器执行monitorenter时会进入到 InterpreterRuntime.cpp的
174 0
Java同步关键字synchronize底层实现原理(中)