一.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) {
}
}
  • 因为s1s2的创建都使用的是直接赋值,此时的hello会创建在常量池中,实际上s1s2都指向的是同一个对象,被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的更多相关文章

  1. Java 多线程 —— synchronized关键字

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  2. java多线程中的volatile和synchronized

    package com.chzhao; public class Volatiletest extends Thread { private static int count = 0; public ...

  3. Java多线程系列八——volatile和ThreadLocal

    参考资料: http://ifeve.com/java-memory-model-4/ http://www.infoq.com/cn/articles/java-memory-model-1 htt ...

  4. java多线程4:volatile关键字

    上文说到了 synchronized,那么就不得不说下 volatile关键字了,它们两者经常协同处理多线程的安全问题. volatile保证可见性 那么volatile的作用是什么呢? 在jvm运行 ...

  5. Java多线程synchronized同步

    非线程安全问题 “非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程问题”.也即是说,方法中的变量永远是线程安全的. 如果多个线程共同访问1个对象中的实例变量,则可能线程 ...

  6. Java 线程 — synchronized、volatile、锁

    线程同步基础 synchronized 和volatile是Java线程同步的基础. synchronized 将临界区的内容上锁,同一时刻只有一个进程能访问该临界区代码 使用的是内置锁,锁一个时刻只 ...

  7. JAVA多线程synchronized详解

    Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 当两个并发线程访问同一个对象object中的这个synchronized(this)同 ...

  8. java 多线程11:volatile关键字

    直接先举一个例子普通的线程实例变量的非可见性: public class MyThread28 extends Thread { private boolean isRunning = true; p ...

  9. java多线程-synchronized

    一.线程安全问题 多线程操作各自线程创建的资源的时候,不存在线程安全问题.但多线程操作同一个资源的时候就会出现线程安全问题.下例为两个线程操作同一个name资源时发生的问题. class TestSy ...

  10. Java多线程 -- 正确使用Volatile变量

    Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”:与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少, ...

随机推荐

  1. 【Linux】【Shell】【Basic】字符串操作

    1. 字符串切片:             ${var:offset:number}                 取字符串的子串:                 取字符趾的最右侧的几个字符:${ ...

  2. layui-入门

    1.下载layui 2.导入layui <title>开始使用layui</title> <!-- 导入js样式 --> <link rel="st ...

  3. C#深入理解多态

    1.里氏替换原则 1.里氏替换原则:在一个软件系统中,如果子类出现在父类出现的位置,而整个软件功能又没有影响,那么咱们称为里氏替换. 2. 考试题:父类变量指向子类对象!! 3.里氏替换  是     ...

  4. Mysql脚本 生成测试数据

    使用: ./xie.sh -uroot -p'123456' #!/bin/bash #混合测试数据库脚本 #将创建一个single数据库,其中创建一个s1表 #如果数据库存在,将会写入数据,可以在写 ...

  5. JeeSite Spring Cloud安装搭建

    引言 JeeSite Cloud 具备 JeeSite 4.x 的所有功能,是在 JeeSite 4.x 基础之上,完成的 Spring Cloud 分布式系统套件的整合.它利用 JeeSite 4. ...

  6. 通过idea创建Maven项目整合Spring+spring mvc+mybatis

    创建项目 File→new→project             然后就不断next直到项目面板出来 设置文件夹         注意:这里我个人习惯,在java下还建了ssm文件夹,然后再cont ...

  7. 微前端框架 qiankun 技术分析

    我们在single-spa 技术分析 基本实现了一个微前端框架需要具备的各种功能,但是又实现的不够彻底,遗留了很多问题需要解决.虽然官方提供了很多样例和最佳实践,但是总显得过于单薄,总给人一种&quo ...

  8. LuoguP7369 [COCI2018-2019#4] Elder 题解

    Content 有一个魔杖最初在 \(Z\) 巫师中.经过 \(n\) 轮较量,第 \(i\) 轮中,\(Z_{i,1}\) 巫师打败了 \(Z_{i,2}\) 巫师.如果一个巫师打败了拥有魔杖的巫师 ...

  9. .NET Core基础篇之:白话管道中间件

    在.Net Core中,管道往往伴随着请求一起出现.客户端发起Http请求,服务端去响应这个请求,之间的过程都在管道内进行. 举一个生活中比较常见的例子:旅游景区. 我们都知道,有些景区大门离景区很远 ...

  10. 一、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-项目引言

    项目文章索引 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入框扩展面板的 ...