2.synchronized同步锁
原文链接:http://blog.csdn.net/zteny/article/details/54863391
简介
synchronized是Java语言的一个关键字,用来修饰一个方法或者代码块,使得目标达到线程同步的目的。
当我们希望某个方法或者代码块,同一时间只能有一个线程能够执行,即是同一时间只有一个线程能够进入该方法或者代码块,其它线程将会被阻塞直接原线程执行结束,此时我们使用该关键字。
用法
由上面的简介可以可得synchronized的两种用法,如下:
public synchronized void bar() {
...
}
public void foo() {
synchronized(this) {
...
}
}
1. 修饰方法
当用synchronized修饰方法时,此时其功能相当于
public void foo() {
synchronized(this) {
...
}
}
为此,我还特意看来了一下java生成class文件,发现对这两份代码生成字节码并不一样。那们为什么会这两种方式,我个人认为原因有二,当synchronized(this)的范围从方法的第一行到最后一行时,直接用synchronized修饰方法就是一种偷懒方式;其次,synchronized(this)可以有控制更小的粒度,既是只要圈住需要同步的代码可以减少的锁持有时长,提高TPS。
如果您有更准确解释,希望您能在文后评论,谢谢
2. 修饰代块码
通过修饰代块码方式来实现同步的目标时,相比修饰方法有两个优势。
1. 只需要圈住(保护)应该圈住的代码块。被圈住的部分才会同步,其它使临界区的访问尽可能的短,从获得更好的性能。
2. 通引用传入的变量作为同步的标量,它允许同一时刻有多个线程同时进入同步块,当它的变量值不同时。反过来,同一时刻且同一个变量值,只允许一个线程进入同步块。
private Object v = new Object;
public void foo() {
synchronized(v) {
System.out.println(Thread.currentThread().getId() + ", enter");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) { }
System.out.println(Thread.currentThread().getId() + ", leave");
}
}
public void bar() {
new Thread(() -> {
foo();
}).start();
new Thread(() -> {
foo();
}).start()
}
它结果应该是(发生阻塞)
0, enter
0, leave
1, enter
1, leave
接下来我们稍微变一下,会出现一个不同的结果
public void bar() {
new Thread(() -> {
v = "123";
foo();
}).start();
new Thread(() -> {
v = "321";
foo();
}).start()
}
它结果是不发生阻塞的
思考
- 当传入的是
v = 1
会怎么这样呢? 当引用的是一个静态不可变变量(即static final Object v = new Object())?
提示1,
Integer a = 1; Integer b = 1;
此时,a == b
为true。当Integer在-128~127是全局都是同一个引用变量。
提示2,ClassLoader。
FAQ
如下这些细节找不到引入理由但又感得这些内容非常有价值,便用FAQ的方式强行带入。
- 能否在synchronized修饰的方法或代码块中发生线程上下文切换?
——能。 - 简述synchronized具有可重入性。
——在synchronized的方法或代码块内可以调用另一个带有synchronized的方法或代码块,而不发生死锁。 - 所有变量v写操作都发生synchronized代码块里,此时如果读操作不在synchronized代码块里,会怎么样呢?
——此时变量v为弱一致性。
2.synchronized同步锁的更多相关文章
- Java中String做为synchronized同步锁使用详解
Java中使用String作同步锁 在Java中String是一种特殊的类型存在,在jdk中String在创建后是共享常量池的,即使在jdk1.8之后实现有所不同,但是功能还是差不多的. 借助这个特点 ...
- Java进程与多线程+线程中的join、yield、wait等方法+synchronized同步锁使用
首先了解什么是多线程与进程 进程:是一个执行过程,动态的概念 --->会分配内存线程:是进程的一个单元,线程是系统最小的执行单元 详解: http://blog.csdn.net/luoweif ...
- 深入研究 synchronized 同步锁 作用于 静态方法 和 非静态方法 的 区别
1.前言 众所周知, synchronized 是同步锁 ,虽然在底层又细分了无锁.偏向锁.轻量级锁.自旋锁 以及重量级锁 机制, 这些底层锁知道一下原理即可 ,[想要 了解 这篇 博文 有 解释 : ...
- 继承Runnable 实现Synchronized 同步锁
在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...
- synchronized同步锁
在多线程的情况下,由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问.由于 ...
- 三、synchronized同步锁
一.简介 在Java多线程中,我们要实现同步串行最早接触的就是synchronized关键字. 基本语法如下: synchronized(锁) { // 代码块 } sychronized关键字的锁主 ...
- synchronized同步锁+单利模式
public static synchronized VolleyRequestController getInstance() { if (sInstance == null) { ...
- Java中String做为synchronized同步锁
synchronized (("" + userId).intern()) { // TODO:something } JVM内存区域里面有一块常量池,关于常量池的分配: JDK6 ...
- synchronized同步代码块锁释放
今天发现自己写的线上程序出现数据库不能同步的问题,查看日志已经停止记录,随后使用jstack查看线程的运行状况,发现有个同步线程锁住了. 以下是jstack -l 637 问题线程的内容. &quo ...
随机推荐
- 【Mac】解决外接显示器时无法用键盘调节音量
背景:mac book pro 外接一台显示器 可以有音量,音量较小, 外接两台显示器时候直接显示如下了 解决办法: 操作步骤: 从 GitHub 下载 SoundFlower 扩展,并安装.(首次 ...
- Docker容器(三)——容器端口映射
(1).容器端口映射 容器的端口映射用到了-p选项,-p [物理机端口]:[容器实例端口] 让centos:httpd运行在后台 [root@youxi1 ~]# docker run -d -p 8 ...
- 【源码解析】Flink 滑动窗口数据分配到多个窗口
之前一直用翻滚窗口,每条数据都只属于一个窗口,所有不需要考虑数据需要在多个窗口存的事情. 刚好有个需求,要用到滑动窗口,来翻翻 flink 在滑动窗口中,数据是怎么分配到多个窗口的 一段简单的测试代码 ...
- python的网络工具scapy
文档 https://scapy.readthedocs.io/en/latest/api/scapy.sendrecv.html 阅读文档 https://blog.csdn.net/Al_xin/ ...
- 深度技术W10系统中绑定MAC地址和IP地址的设置技巧
深度技术W10系统中绑定MAC地址和IP地址的设置技巧分享给大家,感兴趣的用户,请一起来了解下,以备以后作参考,具体如下:1.点击“开始——搜索”,输入CMD命令,然后在CMD上右键选择以管理员身份运 ...
- 重磅!滴滴跨端框架Chameleon 1.0正式发布
滴滴在 GitHub 上开源的跨端解决方案 Chameleon(简写 CML)正式发布 1.0 版本,中文名卡梅龙:中文意思变色龙,意味着就像变色龙一样能适应不同环境的企业级跨端整体解决方案,具有易用 ...
- STAR软件的学习
下载地址与参考文档 https://github.com/alexdobin/STAR/archive/2.5.3a.tar.gz wget https://github.com/alexdobin/ ...
- [转帖]Nginx Image Module图片缩略图 水印处理模块
Nginx Image Module图片缩略图 水印处理模块 https://www.cnblogs.com/jicki/p/5546972.html Nginx Image Module图片缩略图 ...
- .NET Core 配置文件
老一代配置系统 1,XML格式 格式单一. 2,配置信息Kye,只能一维化配置 3,框架信息和应用程序信息混合到一起 应用程序中是 App.config web项目中 web.co ...
- Mkdown常用语法
这篇笔记停了两天,今天开始整理, 写这篇笔记主要是加强下自己的mkdown语法知识, 也当作练手之作. Mkdown 语法简介 标题 [h1 - h6] # ~ ###### 一般# 作为标题, 只有 ...