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

主要阐述以下几个问题:

1.非static方法前加synchronized

 class Demo{
synchronized public void doXXX(){
//code…
}
}

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

  1. 理解synchronized锁的是什么?
  2. 如果三个线程里分别new了三个Demo对象,各自的run方法里分别执行各自Demo对象的doXXX方法,那么synchronized还起作用吗?
  3. 如果三个线程里共用一个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同步块

 class Demo {
public void doXXX(){
synchronized(this){
//code…
}
}
}

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

  1. 括号里填this?
  2. 括号里填类.class?
  3. 括号里填一个对象?

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

分析:

  1. 如果填this,多线程共用同一个Demo对象时,可以控制并发操作带来的问题,如果各个线程使用各自的Demo对象时,是没有用的。
  2. 如果填类.class,相当于对类加锁,也就是在该类的所有成员间实现互斥,在同一时间只有一个线程可访问该类的实例(如果需要在线程间相互唤醒就需要借助Object类的wait()方法及nofity()方法),这种方法,不管各个线程使用同一个Demo对象还是使用各自的Demo对象,都可以解决并发操作带来的问题。一般用方法所在类.class或者方法所在类内部定义一个static的对象,作为锁。这种方式称为全局锁。
  3. 对象的情况有很多,可以来自Demo类内部(static和非static),外部传入(static和非static),但是要传哪种,相信你看完上面两条分析,心里应该有数了。

3.static方法前加synchronized

 class Demo{
public static synchronized void doXXX{
//code…
}
}

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

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

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

请尊重作者劳动成果,

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

synchronized关键字的更多相关文章

  1. 从JAVA看C#中volatile和synchronized关键字的作用

    最近一直在想C#中 volatile关键字到底是用来干什么的?查了很多.NET的文章都是说用volatile修饰的变量可以让多线程同时修改,这是什么鬼... 然后查到了下面这篇JAVA中关于volat ...

  2. Java多线程系列--“基础篇”04之 synchronized关键字

    概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...

  3. java中synchronized关键字的用法

    在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...

  4. 深入理解java中的synchronized关键字

    synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D ...

  5. synchronized关键字,Lock接口以及可重入锁ReentrantLock

    多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...

  6. Java synchronized关键字用法(清晰易懂)

    本篇随笔主要介绍 java 中 synchronized 关键字常用法,主要有以下四个方面: 1.实例方法同步 2.静态方法同步 3.实例方法中同步块 4.静态方法中同步块 我觉得在学习synchro ...

  7. volatile与synchronized关键字

    volatile关键字相信了解Java多线程的读者都很清楚它的作用.volatile关键字用于声明简单类型变量,如int.float.boolean等数据类型.如果这些简单数据类型声明为volatil ...

  8. Java 多线程 —— synchronized关键字

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  9. 【深入比较ThreadLocal模式与synchronized关键字】

    [深入比较ThreadLocal模式与synchronized关键字]ThreadLocal模式与synchronized关键字都是用于处理多线程并发访问变量的问题.只是两者处理问题的角度和思路不同. ...

  10. java synchronized关键字浅探

    synchronized 是 java 多线程编程中用于使线程之间的操作串行化的关键字.这种措施类似于数据库中使用排他锁实现并发控制,但是有所不同的是,数据库中是对数据对象加锁,而 java 则是对将 ...

随机推荐

  1. matlab 嵌套循环的学习

    循环嵌套带嵌套的循环一般为两重,举例1: disp('一个简单的二重for循环'); : : result = ii *jj ; fprintf(' %d * %d = %d \n',ii,jj,re ...

  2. JavaScript中国象棋程序(3) - 电脑自动走棋

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第3节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  3. 从C#到TypeScript - Generator

    总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...

  4. [笔记]关于支持向量机(SVM)中 SMO算法的学习(一)理论总结

    1. 前言 最近又重新复习了一遍支持向量机(SVM).其实个人感觉SVM整体可以分成三个部分: 1. SVM理论本身:包括最大间隔超平面(Maximum Margin Classifier),拉格朗日 ...

  5. YoMail 邮箱客户端的社会化之路,起于邮箱,不止于邮件

    你还记不记得上一次用邮箱处理私人事务是什么时候?从什么时候开始邮箱于你而言,唯一功能沦为了收取各种网站的验证信息? 电子邮件实际上非常适合于工作上使用,比起其他通信工具,或者社会化媒体,电子邮件在工作 ...

  6. 在Azure上部署带有GPU的深度学习虚拟机

    1. 登录https://portal.azure.com 2. 点击"+创建",在弹出的页面搜索"deep learning toolkit for the DSVM& ...

  7. 自定义view(一)

    为什么标题会是自定义view(一)呢?因为自定义view其实内容很多,变化也很多,所以我会慢慢更新博客,争取多写的有关的东西,同时,如果我以后学到了新的有关于自定义view的东西,我也会及时写出来. ...

  8. 第34篇 再谈http协议

    从打开一个网址说起 当在浏览器中输入一个网址的时候,浏览器会渲染出对应的网页的内容.作为web开发人员来说,应该知道这个过程: 当输入的一个网址为域名的时候,浏览器则根据本机的网关和DNS服务器来解析 ...

  9. swiper遇到的问题及解决方法

    上一家公司主要是做些微信的场景页啥的,然后需要快速开发,所以第一时间选择了swiper,毕竟开发快速,比较方便然后api多(虽然并没有用很多),用这个的朋友.缺点的话有时候用了就晓得,下面开始讲讲,第 ...

  10. MyEclipse下安装MyBatis Generator代码反向生成工具

    一.离线方式: 在http://mybatis.googlecode.com/svn/sub-projects/generator/trunk/eclipse/UpdateSite/下载 featur ...