【java多线程】synchronized和volatile
文章目录
一.synchronized
1.synchronized使用的方法
- 可以直接修饰代码块
synchronized (this) {
//代码块
}
- 调用可能出现并发问题的方法
synchronized (this) {
method();
}
- 修饰方法
public synchronized void method() {
//...
}
2.注意
当synchronized修饰方法时:
- 非静态方法中,synchronized锁当前对象:
this
- 静态方法中,synchronized锁的是当前类的字节码对象
User.class
3.不要以字符串作为锁的对象
- 有如下代码
String s1 = "hello";
String s2 = "hello";
void m1() {
synchronized (s1) {
}
}
void m2() {
synchronized (s2) {
}
}
- 因为
s1
和s2
的创建都使用的是直接赋值,此时的hello
会创建在常量池中,实际上s1
,s2
都指向的是同一个对象,被s1、s2引用。 - 所以,此时的
synchronized (s1)
和synchronized (s2)
实际上锁的都是同一个对象。 - 因此,使用
synchronized
锁的时候最好不要锁字符串类型。 - 如果非要锁字符串,那么使用
new String ("hello")
的方法来创建字符串,因为这样创建出来的字符串就是两个堆内存中的对象了。
4.synchronized
锁的是什么?
synchronized
锁的是堆内存中new
出来的对象,而不是栈中的引用。
二、volatile
1.引出问题
两个线程操作同一个主存数据时,会先将主存中的数据复制到自己的内存区域,将数据修改后,再写回主存。
两线程同时复制到自己内存后:
- 线程1将数据修改
a=1
后,写回主存 - main线程很忙,一直在进行while(true) 循环,没有时间再去主存中读取新的数据,所以main线程缓存中的数据还是
a=0
- 为了解决这个问题,就引出了
volatile
2. volatile
使用方法
- 直接将
volatile
关键字加在要操作的数据上
private volatile int a = 0;
3.volatile原理
- 当
线程1
将数据修改后,会通知main线程
:“你的数据已经过期了” - 此时
main线程
会从主存中重新读取
新的数据 - 这也就是volatile三个特性的-
保证可见性
4.volatile三大特性
- 保证可见性
- 不保证原子性
- 禁止指令重排
三、volatile和synchronized的区别
1.区别
- volatile是轻量级的,synchronized是是重量级的
- volatile保证内存可见性,而不保证原子性(解决此问题的办法:就是使用原子数据)
- synchronized既保证内存可见性,也保证原子性
2.解决原子性问题–原子型数据类型
- 在
java.util.concurrent.atomic
包下,有基本数据类型对应的原子型的数据类型,类似于基本数据类型的包装类型。
3.让对象类型数据具有原子型
- 还是在
java.util.concurrent.atomic
包下,有一个类,可以使对象类型的数据具有原子性:AtomicReference
//创建两个对象
User zhangsan = new User("zhangsan");
User sili = new User("sili");
//创建原子操作对象
AtomicReference<User> atomicReference = new AtomicReference<User>();
//比较并交换
boolean b = atomicReference.compareAndSet(zhangsan, sili);
System.out.println(b);
【java多线程】synchronized和volatile的更多相关文章
- Java 多线程 —— synchronized关键字
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- java多线程中的volatile和synchronized
package com.chzhao; public class Volatiletest extends Thread { private static int count = 0; public ...
- Java多线程系列八——volatile和ThreadLocal
参考资料: http://ifeve.com/java-memory-model-4/ http://www.infoq.com/cn/articles/java-memory-model-1 htt ...
- java多线程4:volatile关键字
上文说到了 synchronized,那么就不得不说下 volatile关键字了,它们两者经常协同处理多线程的安全问题. volatile保证可见性 那么volatile的作用是什么呢? 在jvm运行 ...
- Java多线程synchronized同步
非线程安全问题 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程问题”.也即是说,方法中的变量永远是线程安全的. 如果多个线程共同访问1个对象中的实例变量,则可能线程 ...
- Java 线程 — synchronized、volatile、锁
线程同步基础 synchronized 和volatile是Java线程同步的基础. synchronized 将临界区的内容上锁,同一时刻只有一个进程能访问该临界区代码 使用的是内置锁,锁一个时刻只 ...
- JAVA多线程synchronized详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 当两个并发线程访问同一个对象object中的这个synchronized(this)同 ...
- java 多线程11:volatile关键字
直接先举一个例子普通的线程实例变量的非可见性: public class MyThread28 extends Thread { private boolean isRunning = true; p ...
- java多线程-synchronized
一.线程安全问题 多线程操作各自线程创建的资源的时候,不存在线程安全问题.但多线程操作同一个资源的时候就会出现线程安全问题.下例为两个线程操作同一个name资源时发生的问题. class TestSy ...
- Java多线程 -- 正确使用Volatile变量
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”:与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少, ...
随机推荐
- Mave 下载与安装
一,Maven 介绍 我们在开发中经常需要依赖第三方的包,包与包之间存在依赖关系,版本间还有兼容性问题,有时还需要将旧的包升级或降级,当项目复杂到一定程度时包管理变得非常重要.Maven是当前最受欢迎 ...
- 多线程异步操作导致异步线程获取不到主线程的request信息
org.springframework.web.context.request.RequestContextHolderorg.springframework.web.context.request. ...
- 小程序中使用less(最优方式)
写惯了less/sass,但是现在开发小程序缺还是css,很不习惯. 在网上搜的教程,要么是gulp,要么就是vscode的Easy-less的插件. 传统方式 我们来对比,这两种方式的优劣. Gul ...
- 【Linux】【Services】【Docker】网络
容器的网络模型: closed container: 仅有一个接口:loopback 不参与网络通信,仅适用于无须网络通信的应用场景,例如备份.程序调试等: --net none bridged co ...
- html如何让input number类型的标签不产生上下加减的按钮(转)
添加css代码: <style> input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit- ...
- 【C++】最长回文子串/动态规划
ACM #include <bits/stdc++.h> using namespace std; const int maxn = 1010; char S[maxn]; int dp[ ...
- Linkerd Service Mesh 授权策略(Server & ServerAuthorization)
简介 Server 和 ServerAuthorization 是 Linkerd 中的两种策略资源, 用于控制对 mesh 应用程序的入站访问. 在 linkerd 安装期间,policyContr ...
- 前端浅谈-协议相关(http/https)
当DNS工作完之后得到了一个网址 https//192.168.1.255/index.html 这个并不符合标准的请求路径.接下来就是https的功能了.讲https前先讲讲它的前身http协议 H ...
- Table.ReorderColumns移动…Reorder…(Power Query 之 M 语言)
数据源: 至少两列 目标: 列顺序重新排列 操作过程: 选取待移动的列>鼠标拖放列标题 选取待移动的列>[转换]>[移动]>选取 M公式: = Table.ReorderCo ...
- 4、BFS算法套路框架——Go语言版
前情提示:Go语言学习者.本文参考https://labuladong.gitee.io/algo,代码自己参考抒写,若有不妥之处,感谢指正 关于golang算法文章,为了便于下载和整理,都已开源放在 ...