最近重新梳理了下java的synchronized相关内容,希望能帮助到有需要的朋友们。

主要阐述以下几个问题:

1.非static方法前加synchronized

1 classDemo{2 synchronized public voiddoXXX(){3 //code…

4 }5 }

View Code

对于这段代码,我们要考虑这几个问题:

理解synchronized锁的是什么?

如果三个线程里分别new了三个Demo对象,各自的run方法里分别执行各自Demo对象的doXXX方法,那么synchronized还起作用吗?

如果三个线程里共用一个Demo对象,各自的run方法里分别执行这个共用Demo对象的doXXX方法,那么synchronized还起作用吗?

在非static方法前面加synchronized,锁的是这个new出来的Demo对象的本身,也就是this。要执行doXXX方法,必须要先获取对象锁(即对象本身)。

所以,2中doXXX的对象锁来自3个不同的Demo对象,各自线程使用各自Demo对象的锁,不存在共用锁的情况,synchronized不起作用。

同理,3中doXXX的对象锁来自1个相同的Demo对象,各自线程使用同个Demo对象的锁,存在共用锁的情况,synchronized起作用。

2.方法内部synchronized同步块

1 classDemo {2 public voiddoXXX(){3 synchronized(this){4 //code…

5 }6 }7 }8

View Code

对于这段代码,我们需要考虑这几个问题:

括号里填this?

括号里填类.class?

括号里填一个对象?

synchronized锁住的是括号里的对象,而不是代码。所以多线程情况下要执行doXXX,要先获得锁,即括号里指定的内容。

分析:

如果填this,多线程共用同一个Demo对象时,可以控制并发操作带来的问题,如果各个线程使用各自的Demo对象时,是没有用的。

如果填类.class,相当于对类加锁,也就是在该类的所有成员间实现互斥,在同一时间只有一个线程可访问该类的实例(如果需要在线程间相互唤醒就需要借助Object类的wait()方法及nofity()方法),这种方法,不管各个线程使用同一个Demo对象还是使用各自的Demo对象,都可以解决并发操作带来的问题。一般用方法所在类.class或者方法所在类内部定义一个static的对象,作为锁。这种方式称为全局锁。

对象的情况有很多,可以来自Demo类内部(static和非static),外部传入(static和非static),但是要传哪种,相信你看完上面两条分析,心里应该有数了。

3.static方法前加synchronized

1 classDemo{2 public static synchronized voiddoXXX{3 //code…

4 }5 }6

View Code

static的synchronized方法,所以它锁的不是this,而是类的Class对象,而且方法中无法使用this。可见,这种方式不管new几个Deom调用doXXX,都不会并发。

相信你理解了上面三个问题,那么你对synchronized关键字就有了一定的了解,并能够将它运用在处理并发操作的问题上了。

-----------------------------------------------------

请尊重作者劳动成果,

转载请注明出处:http://www.cnblogs.com/ryanyu/p/6647121.html

JAVA加勒比_【JAVA】synchronized关键字相关推荐

  1. Java线程同步机制synchronized关键字的理解

    由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 需要明确的几个问题: ...

  2. 密码锁 java接口_从synchronized和lock区别入手聊聊java锁机制

    写这篇文章之前,我去百度了一下啥叫锁,百度百科上写道:置于可启闭的器物上,以钥匙或暗码开启.确实我们一般理解的锁就是门锁,密码锁,但是在计算机科学中,锁又是啥,说实话,这个问题我也思考了很久,也没法很 ...

  3. Java并发编程之synchronized关键字解析

    前言 公司加班太狠了,都没啥时间充电,这周终于结束了.这次整理了Java并发编程里面的synchronized关键字,又称为隐式锁,与JUC包中的Lock显示锁相对应:这个关键字从Java诞生开始就有 ...

  4. java沙漏_(java)五大常用算法

    算法一:分治法 基本概念1.把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并.2.分治策略是对于一个规模 ...

  5. android java教程_[Java教程]Android开发快速入门

    [Java教程]Android开发快速入门 0 2020-12-22 18:01:40 Xamarin.Android 应用程序剖析 以下屏幕截图列出了解决方案的内容. 下面是一个解决方案资源管理器, ...

  6. java 矩阵_(JAVA)计算机图形学与矩阵

    (JAVA)计算机图形学与矩阵 平移 旋转 变比 一)矩阵 1)矩阵的乘法运算 矩阵是计算机图形学的重要工具. 计算机图形学要常常用到 矩阵乘法(矩阵与矩阵相乘). 矩阵(Aij)m*n 与矩阵(Bi ...

  7. java后门_@Java Web 程序员,我们一起给程序开个后门吧:让你在保留现场,服务不重启的情况下,执行我们的调试代码...

    从数据库.redis取了些数据,做了一些运算后,没抛异常,但是就是结果不对 抛了个空指针异常,但是看代码,感觉没问题,是取出来就是空,还是中间什么函数把它改坏了 发现导致一个bug的原因是用了JVM缓 ...

  8. ie8不兼容java项目_[Java教程]ie8以下不兼容document.getElementsByName解决方法

    [Java教程]ie8以下不兼容document.getElementsByName解决方法 0 2016-09-13 19:00:06 在IE8以认为只有文本标签才有name属性的,一些元素标签用d ...

  9. java切片_ java中一个极其强悍的新特性Stream详解(非常实用)

    java8中有两个非常有名的改进,一个是Lambda表达式,一个是Stream.如果我们了解过函数式编程的话,都知道Stream真正把函数式编程的风格引入到了java中.这篇文章由简入繁逐步介绍Str ...

最新文章

  1. 用 gson 替换 fastjson 引发的线上问题分析
  2. 使用Project Lombok减少Java应用程序中的样板代码
  3. VM虚拟机中CentOS6.4操作系统安装一
  4. 【疑问感受】初见指针——当函数遇到指针
  5. mysql 交互命令 导出_MySQL数据导入导出方法与工具(2)
  6. 博思得标签打印机驱动_惠普LaserJet 5200n驱动-惠普HP LaserJet 5200n打印机驱动下载 v61.074.561.43官方版...
  7. com.mysql.jdbc.jdbc2.optional.MysqlXADataSource 找不到
  8. keil 函数最多可以传几个参数_Keil C51中如何让一个函数返回多个值?我把数组指针传入函数中,但发现编译后DATA区会随...
  9. 解决Mac自动切换输入法
  10. 720视频2码率够吗_两个人去丽江5000够吗,2人去云南旅游5天多少钱(超详细篇)...
  11. 2012春节快到了我们聚会吧!
  12. 现在,您可以在YouTube上播放免费的,广告支持的电影
  13. 外骨骼机器人(一):Lokomat核心技术简介
  14. 将VSCode语言环境设置为中文
  15. 特别有趣的猜数小游戏
  16. python报错“cannot import name ft2font”
  17. Gentoo 教程:目录
  18. 用条件编译方法实现以下功能:输入一行电报文字,可以任选两种输出,一为原文输出;一为将字母变成其下一个字母。用define命令控制
  19. Mybatis中foreach的三种用法
  20. 如何把在一些管家软件下载的谷歌卸载干净(谷歌卸载不干净、安装不成功的原因,谷歌首页被360篡改)

热门文章

  1. DWR学习笔记 - Hello World
  2. 如何获取InnoDB树的高度
  3. 巩固shell基础知识
  4. 《CCNP TSHOOT 300-135学习指南》——1.2节结构化故障检测与排除方法
  5. ZOJ 3817Chinese Knot(The 2014 ACM-ICPC Asia Mudanjiang Regional First Round)
  6. Extjs4.x (MVC)Controller中refs以及Ext.ComponentQuery解析
  7. 递归(二)-------经典递归实例(汉诺塔问题)
  8. MDaemon替换注册码怎样人工激活.docx
  9. 通过 Kubeflow 实例瞄准 Kubernetes 集群的密币挖掘攻击
  10. 开源OS FreeBSD 中 ftpd chroot 本地提权漏洞 (CVE-2020-7468) 的技术分析