我们都知道 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几种常见用法相关推荐

  1. 动词ing形式的5种用法_动词ing的几种常见用法

    龙源期刊网 http://www.qikan.com.cn 动词 ing 的几种常见用法 作者:张爱娟 来源:<中学生英语 · 阅读与写作> 2016 年第 10 期 为了让同学们更好掌握 ...

  2. Java接口的几种常见用法

    接口(interface)对于面向对象编程来说是一个非常重要的概念.它是一系列方法的声明,却没有具体实现.有些编程语言,比如swift,把接口解释成"协议(protocol)",我 ...

  3. 计算机excelsumif的公式,excel中sumif函数的几种常见用法

    在excel中sumif函数是一个非常有用的函数,它可以按条件进行求和.其实从这个函数的名字就可以看出来它是用来干什么的,SUM是求和,IF是如果.如果什么..就求和,其实就是按条件求和.本教程图文详 ...

  4. 二极管在LDO电路中的几种常见用法

    文章目录 1.防反接--二极管接在VIN端 2.防反接--二极管接在GND端 3.输入输出钳位保护 4.降压&防灌电 大家好,我是记得诚. 交流群的一次讨论,想到简单汇总一下,二极管在LDO电 ...

  5. ROS MarkerArray的几种常见用法

    ros使用过程中,经常会用到rviz可视化各种数据.而在rviz中,marker与markerarray是常用的一种可视化工具,最近也用到过几次了,这里随手记录一下. 1.makerarray画线 在 ...

  6. linux中touch命令如何使用,Linux Touch命令的8种常见用法

    除了在Linux上简单地创建一个空文件之外,Linux touch命令还有更多的用途.您也可以使用它来更改现有文件的时间戳,包括它们的访问和修改时间.本文介绍了8种通过Linux终端使用touch命令 ...

  7. 消息模式Toast.makeText的几种常见用法

    转载自:http://daikainan.iteye.com/blog/1405575 Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户,它 ...

  8. java中for 的几种常见用法

    来自:http://blog.csdn.net/sunhui8888/article/details/7353746 J2SE 1.5提供了另一种形式的for循环.借助这种形式的for循环,可以用更简 ...

  9. android 消息模式Toast.makeText的几种常见用法

    Toast 是一个 View 视图,快速的为用户显示少量的信息. Toast 在应用程序上浮动显示信息给用户,它永远不会获得焦点,不影响用户的输入等操作,主要用于 一些帮助 / 提示. Toast 最 ...

  10. 实例讲解sed的9种常见用法

    转自:http://blog.csdn.net/showman/archive/2009/07/31/4396142.aspx 1.       打印:p [root@TestAs4 chap04]# ...

最新文章

  1. php 入口文件引入取别名,php命名空间别名/导入
  2. RoHS、无铅制程、无卤 的基本介绍
  3. vc c语言坐标图,VC++6.0下C语言画图编程问题
  4. 大大大大数怎么求余?C语言
  5. 论文浅尝 | Hike: A Hybrid Human-Machine Method for Entity Alignment
  6. java 请求url 返回数据_java后台发起get请求获取响应数据|chu
  7. retrun, 集合操作的转化思想,while()回到指定位置的巧妙应用
  8. 好用到让设计师尖叫的UI设计网格素材
  9. C++模板之一:函数模板.odt
  10. Beta Daily Scrum 第五天
  11. oozie 调度pyspark
  12. 时空、维度,以及其他(二)
  13. (简单)华为Nova青春 WAS-AL00的USB调试模式在哪里开启的流程
  14. 小学到大学各类英语教学视频(一)
  15. iphone手机配置qq邮箱服务器设置,在iPhone中如何设置qq邮箱
  16. java 生成 rtf_如何从Java生成RTF?
  17. 大数据人工智能技术全攻略(一)
  18. 深度学习(8)-NLP(词嵌入,嵌入矩阵,词向量,情绪分类,偏见问题)
  19. 计算机一级网址打不开怎么办,路由器设置网址打不开怎么办?
  20. 怎么把画好的流程图插入到Word中?

热门文章

  1. @WebListener 注解方式实现监听(eclipse和idea)
  2. 本两个Build工作总结
  3. PCL Examples
  4. php部分---注册审核
  5. sap快捷搜索菜单栏
  6. 学在LINUX下编程(转)
  7. [leetcode] Nim Game
  8. 闭包基础概念,闭包详解
  9. 给iphone或touch加桌面图标
  10. mysql 密码保存格式_mysql5.6使用老格式密码