synchronized几种常见用法
我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面。其实 Synchronized 可以用到更多的场合,栈长列举了以下几个用法。
1、同步普通方法
这个也是我们用得最多的,只要涉及线程安全,上来就给方法来个同步锁。这种方法使用虽然最简单,但是只能作用在单例上面,如果不是单例,同步方法锁将失效。
/*** 用在普通方法*/
private synchronized void synchronizedMethod() {System.out.println("synchronizedMethod");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
}
此时,同一个实例只有一个线程能获取锁进入这个方法。
2、同步静态方法
同步静态方法,不管你有多少个类实例,同时只有一个线程能获取锁进入这个方法。
/*** 用在静态方法*/
private synchronized static void synchronizedStaticMethod() {System.out.println("synchronizedStaticMethod");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}
}
同步静态方法是类级别的锁,一旦任何一个线程进入这个方法,其他所有线程将无法访问这个类的任何同步类锁的方法。
3、同步类
下面提供了两种同步类的方法,锁住效果和同步静态方法一样,都是类级别的锁,同时只有一个线程能访问带有同步类锁的方法。
/*** 用在类*/
private void synchronizedClass() {synchronized (TestSynchronized.class) {System.out.println("synchronizedClass");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}
}/*** 用在类*/
private void synchronizedGetClass() {synchronized (this.getClass()) {System.out.println("synchronizedGetClass");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}
}
这里的两种用法是同步块的用法,这里表示只有获取到这个类锁才能进入这个代码块。
4、同步this实例
这也是同步块的用法,表示锁住整个当前对象实例,只有获取到这个实例的锁才能进入这个方法。
/*** 用在this*/
private void synchronizedThis() {synchronized (this) {System.out.println("synchronizedThis");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}
}
用法和同步普通方法锁一样,都是锁住整个当前实例。
5、同步对象实例
这也是同步块的用法,和上面的锁住当前实例一样,这里表示锁住整个 LOCK 对象实例,只有获取到这个 LOCK 实例的锁才能进入这个方法。
/*** 用在对象*/
private void synchronizedInstance() {synchronized (LOCK) {System.out.println("synchronizedInstance");try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}
}
另外,类锁与实例锁不相互阻塞,但相同的类锁,相同的当前实例锁,相同的对象锁会相互阻塞。
synchronized几种常见用法相关推荐
- 动词ing形式的5种用法_动词ing的几种常见用法
龙源期刊网 http://www.qikan.com.cn 动词 ing 的几种常见用法 作者:张爱娟 来源:<中学生英语 · 阅读与写作> 2016 年第 10 期 为了让同学们更好掌握 ...
- Java接口的几种常见用法
接口(interface)对于面向对象编程来说是一个非常重要的概念.它是一系列方法的声明,却没有具体实现.有些编程语言,比如swift,把接口解释成"协议(protocol)",我 ...
- 计算机excelsumif的公式,excel中sumif函数的几种常见用法
在excel中sumif函数是一个非常有用的函数,它可以按条件进行求和.其实从这个函数的名字就可以看出来它是用来干什么的,SUM是求和,IF是如果.如果什么..就求和,其实就是按条件求和.本教程图文详 ...
- 二极管在LDO电路中的几种常见用法
文章目录 1.防反接--二极管接在VIN端 2.防反接--二极管接在GND端 3.输入输出钳位保护 4.降压&防灌电 大家好,我是记得诚. 交流群的一次讨论,想到简单汇总一下,二极管在LDO电 ...
- ROS MarkerArray的几种常见用法
ros使用过程中,经常会用到rviz可视化各种数据.而在rviz中,marker与markerarray是常用的一种可视化工具,最近也用到过几次了,这里随手记录一下. 1.makerarray画线 在 ...
- linux中touch命令如何使用,Linux Touch命令的8种常见用法
除了在Linux上简单地创建一个空文件之外,Linux touch命令还有更多的用途.您也可以使用它来更改现有文件的时间戳,包括它们的访问和修改时间.本文介绍了8种通过Linux终端使用touch命令 ...
- 消息模式Toast.makeText的几种常见用法
转载自:http://daikainan.iteye.com/blog/1405575 Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户,它 ...
- java中for 的几种常见用法
来自:http://blog.csdn.net/sunhui8888/article/details/7353746 J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简 ...
- android 消息模式Toast.makeText的几种常见用法
Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于 一些帮助 / 提示. Toast 最 ...
- 实例讲解sed的9种常见用法
转自:http://blog.csdn.net/showman/archive/2009/07/31/4396142.aspx 1. 打印:p [root@TestAs4 chap04]# ...
最新文章
- php 入口文件引入取别名,php命名空间别名/导入
- RoHS、无铅制程、无卤 的基本介绍
- vc c语言坐标图,VC++6.0下C语言画图编程问题
- 大大大大数怎么求余?C语言
- 论文浅尝 | Hike: A Hybrid Human-Machine Method for Entity Alignment
- java 请求url 返回数据_java后台发起get请求获取响应数据|chu
- retrun, 集合操作的转化思想,while()回到指定位置的巧妙应用
- 好用到让设计师尖叫的UI设计网格素材
- C++模板之一:函数模板.odt
- Beta Daily Scrum 第五天
- oozie 调度pyspark
- 时空、维度,以及其他(二)
- (简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
- 小学到大学各类英语教学视频(一)
- iphone手机配置qq邮箱服务器设置,在iPhone中如何设置qq邮箱
- java 生成 rtf_如何从Java生成RTF?
- 大数据人工智能技术全攻略(一)
- 深度学习(8)-NLP(词嵌入,嵌入矩阵,词向量,情绪分类,偏见问题)
- 计算机一级网址打不开怎么办,路由器设置网址打不开怎么办?
- 怎么把画好的流程图插入到Word中?