【同步】

作者: 小呀么小黄鸡 | 来源:发表于2018-02-24 09:48 被阅读2次

java中的volatile和synchronized

一个volatile类型的变量不允许线程从主内存中将变量的值拷贝到自己的存储空间。因此,一个声明为volatile类型的变量将在所有的线程中同步的获得数据,不论你在任何线程中更改了变量,其他的线程将立即得到同样的结果。由于线程存取或更改自己的数据拷贝有更高的效率,所以volatile类型变量在性能上有所消耗。

volatile和synchronized有两方面的不同。首先,synchronized获取和释放由监听器控制的锁,如果两个线程都使用一个监听器(即相同对象锁),那么监听器可以强制在一个时刻只有一个线程能处理代码块,这是最一般的同步。另外,synchronized还能使内存同步。在实际当中,synchronized使得所有的线程内存与主内存相同步。

所以volatile只能在线程内存和主内存之间同步一个变量的值,而synchronized则能同步在线程内存和主内存之间的所有变量的值,通过锁住和释放监听器来实现。显然,synchronized在性能上将比volatile更加有所消耗。

1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。
2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的
3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性
4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。
5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化

互斥

相关文章

  • Linux sersync day35

    什么是实时同步为什么要实时同步实时同步的原理实时同步的场景实时同步工具选择实时同步案例演示 一、什么是实时同步 实...

  • Spring Cloud——Eureka Server服务同步和

    服务同步 服务同步是Server节点之间的数据同步。分为启动时同步,运行时同步。 启动同步 在EurekaServ...

  • Mac版本有道云笔记 同步失败问题

    Mac 版本 有道云笔记同步异常问题,同步失败,无法同步... 最近使用Mac版本有道云笔记,发现同步文件同步失败...

  • 死磕以太坊源码分析之Fetcher同步

    死磕以太坊源码分析之Fetcher同步 Fetcher 功能概述 区块数据同步分为被动同步和主动同步: 被动同步是...

  • ffmpeg 同步

    音视频同步有三种方式 同步音频到视频 同步到外部时钟 同步视频到音频 同步视频到音频 以audio为基准同步vid...

  • OpenMP多线程——Parallel for

    多线程——线程同步 数据竞争问题 线程互斥同步——critical 线程互斥同步——atmoic 线程互斥同步——...

  • UNIX 的5种IO模型介绍

    IO模型同步、异步、阻塞、非阻塞socket阻塞与非阻塞,同步与异步 同步和异步 同步/异步主要针对C端-同步就像...

  • Redis 主从同步

    同步过程 Redis 支持主从复制分为全量同步和增量同步,首次同步是全量同步,主从同步可以让从服务器从 主服务器备...

  • rsync通过服务同步、Linux系统日志、screen

    rsync通过服务同步 Linux文件同步工具-rsync rsync通过服务同步 Linux文件同步工具-rsy...

  • Java16-4 死锁

    死锁有两种情况1、同步嵌套同步方法中嵌套同步代码块或同步代码块嵌套同步代码块出现的错误

网友评论

    本文标题:【同步】

    本文链接:https://www.haomeiwen.com/subject/mydczxtx.html