一分钟告诉你synchronized和volatile的区别

先从一道笔试题开始:

9. volatile关键字是否能保证线程安全?() 答案:不能


synchronized和volatile的区别

synchronised是一个方法级别或块级别的访问限制修饰符,也就是可以放在方法前面也可以用在同步块上。它可以确保一个线程获得一个“禁区”的锁。也就是只有这一个线程拥有进入执行synchronized块的钥匙。如果其他的线程在同一时刻也想访问同步块这个“禁区”,那么他们就必须要等待现在在里边的那个线程出来后释放掉锁才可以进去。(这里你可以理解为排队上厕所)所以是保证线程安全的。

volatile是一个变量上的一个访问修饰符。这个是什么意思呢?就是加了这个关键字以后,就会强制让所有的线程都去从主内存(main memory)中得到最新的值而不是去cache中去拿。特别要注意的是,所有的线程可以同时去拿这个volatile变量,也就是没有加锁的意思。所以并不能保证线程安全。

一个使用volatile变量的典型例子就是Date变量。现在假设我们定义一个时间变量。所有的线程都去得到时间,由于是volatile变量,所以每个线程都会从主内存得到最新的时间值。就不会再有那种不同的线程显示的是不同的时间的情况了。所有的线程都显示了正确的时间。

下面的这个图就是告诉你有关主内存和工作内存的一个关系。

以上只是一个简单的对比说明,我们将会在以后慢慢讨论这两个关键字。

原文发布于微信公众号 - ImportSource(importsource)

原文发表时间:2016-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python绿色通道

Python的进程

Python实现多进程的方式主要有两种:一种方法是使用os模块中的fork方法; 另一种是使用multiprocessing模块。这两种方法的区别在于前者仅适用...

1092
来自专栏java一日一条

深入分析Java线程中断机制

在平时的开发过程中,相信都会使用到多线程,在使用多线程时,大家也会遇到各种各样的问题,今天我们就来说说一个多线程的问题——线程中断。在java中启动线程非常容易...

882
来自专栏数据结构与算法

2991:2011

2991:2011 查看 提交 统计 提问 总时间限制:1000ms内存限制:65536kB描述已知长度最大为200位的正整数n,请求出2011^n的后四位。输...

3407
来自专栏开源优测

接口测试 | 25 requests + pytest测试实例

概述 本文主要分享如何将pytest和requests结合一起使用,让大家有个初步的了解。 主要内容有: pytest简介 pytest + requests示...

3139
来自专栏郭耀华‘s Blog

Python 中的 if __name__ == '__main__' 该如何理解

1984
来自专栏程序员同行者

python3模块: sys

1673
来自专栏好好学java的技术栈

“面试不败计划”:java工程师面试常问的多线程问题【推荐】

1385
来自专栏烂笔头

Python标准库笔记(5) — sched模块

目录[-] 事件调度 sched模块内容很简单,只定义了一个类。它用来最为一个通用的事件调度模块。 class sched.scheduler(timefu...

3665
来自专栏面朝大海春暖花开

微信小程序setData()对数组的操作

但是对于数组而言,再直接修改一个完整的数组显得有些多余,首先写着不简易,其次效率很是滴。

4915
来自专栏林冠宏的技术文章

Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

Golang 简称 Go,Go 的协程(goroutine) 和我们常见的线程(Thread)一样,拥有其调度器。

4351

扫码关注云+社区

领取腾讯云代金券