synchronized关键字
最近重新梳理了下java的synchronized相关内容,希望能帮助到有需要的朋友们。
主要阐述以下几个问题:
1.非static方法前加synchronized
class Demo{
synchronized public void doXXX(){
//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同步块
class Demo {
public void doXXX(){
synchronized(this){
//code…
}
}
}
对于这段代码,我们需要考虑这几个问题:
- 括号里填this?
- 括号里填类.class?
- 括号里填一个对象?
synchronized锁住的是括号里的对象,而不是代码。所以多线程情况下要执行doXXX,要先获得锁,即括号里指定的内容。
分析:
- 如果填this,多线程共用同一个Demo对象时,可以控制并发操作带来的问题,如果各个线程使用各自的Demo对象时,是没有用的。
- 如果填类.class,相当于对类加锁,也就是在该类的所有成员间实现互斥,在同一时间只有一个线程可访问该类的实例(如果需要在线程间相互唤醒就需要借助Object类的wait()方法及nofity()方法),这种方法,不管各个线程使用同一个Demo对象还是使用各自的Demo对象,都可以解决并发操作带来的问题。一般用方法所在类.class或者方法所在类内部定义一个static的对象,作为锁。这种方式称为全局锁。
- 对象的情况有很多,可以来自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关键字的更多相关文章
- 从JAVA看C#中volatile和synchronized关键字的作用
最近一直在想C#中 volatile关键字到底是用来干什么的?查了很多.NET的文章都是说用volatile修饰的变量可以让多线程同时修改,这是什么鬼... 然后查到了下面这篇JAVA中关于volat ...
- Java多线程系列--“基础篇”04之 synchronized关键字
概要 本章,会对synchronized关键字进行介绍.涉及到的内容包括:1. synchronized原理2. synchronized基本规则3. synchronized方法 和 synchro ...
- java中synchronized关键字的用法
在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...
- 深入理解java中的synchronized关键字
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D ...
- synchronized关键字,Lock接口以及可重入锁ReentrantLock
多线程环境下,必须考虑线程同步的问题,这是因为多个线程同时访问变量或者资源时会有线程争用,比如A线程读取了一个变量,B线程也读取了这个变量,然后他们同时对这个变量做了修改,写回到内存中,由于是同时做修 ...
- Java synchronized关键字用法(清晰易懂)
本篇随笔主要介绍 java 中 synchronized 关键字常用法,主要有以下四个方面: 1.实例方法同步 2.静态方法同步 3.实例方法中同步块 4.静态方法中同步块 我觉得在学习synchro ...
- volatile与synchronized关键字
volatile关键字相信了解Java多线程的读者都很清楚它的作用.volatile关键字用于声明简单类型变量,如int.float.boolean等数据类型.如果这些简单数据类型声明为volatil ...
- Java 多线程 —— synchronized关键字
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- 【深入比较ThreadLocal模式与synchronized关键字】
[深入比较ThreadLocal模式与synchronized关键字]ThreadLocal模式与synchronized关键字都是用于处理多线程并发访问变量的问题.只是两者处理问题的角度和思路不同. ...
- java synchronized关键字浅探
synchronized 是 java 多线程编程中用于使线程之间的操作串行化的关键字.这种措施类似于数据库中使用排他锁实现并发控制,但是有所不同的是,数据库中是对数据对象加锁,而 java 则是对将 ...
随机推荐
- OOP面向对象三大特点
OOP面向对象三大特点 (一)封装:将现实中一个事物的属性和功能集中定义在一个对象中.(创建对象) 创建对象的3种方式: 1.直接量方式:(创建一个单独的对象) var obj={ 属性名:值, ...
- Ext Js详解指南
什么是Ext JS 走进Ext的世界 Ext JS是一款富客户端开发框架它基于javascript.HTML和CSS开发而成,无需安装任何插件即可在常用浏览器中创建出绚丽的页面效果. 个人总结Ext ...
- 一个RESTful+MySQL程序
前言 本章内容适合初学者(本人也是初学者). 上一章内容(http://www.cnblogs.com/vanezkw/p/6414392.html)是在浏览器中显示Hello World,今天我们要 ...
- 【录教程必备】推荐几款屏幕录制工具(可录制GIF)
我们经常会遇到一些场景,需要你向别人展示一些操作或是效果——例如告诉别人某某软件的配置步骤啊.刚设计出来网站的动画效果怎么样啊.某某电影里面的一个镜头多么经典啊.打得大快人心的NBA绝杀瞬间是怎么回事 ...
- Codeforces Good Bye 2016 题解
好久没有fst题了...比赛先A了前4题然后发现room里有人已经X完题了没办法只能去打E题,结果差一点点打完...然后C题fst掉了结果就掉rating 了...下面放题解 ### [A. New ...
- unity脚本的运行顺序以及单例的实现
unity引擎把所有脚本先行编译后,在运行的时候一批,一批的函数进行执行. unity脚本自带函数执行顺序如下:将下面脚本挂在任意物体运行即可得到 Awake ->OnEable-> St ...
- Python脚本收集腾讯云CDN日志,并入ELK日志分析
负责搭建公司日志分析,一直想把CDN日志也放入到日志分析,前些日志终于达成所愿,现在贴出具体做法: 1.收集日志 腾讯云CDN日志一般一小时刷新一次,也就是说当前只能下载一小时之前的日志数据,但据本人 ...
- Material Design学习-----CollapsingToolbarLayout
博客引用(http://www.open-open.com/lib/view/open1438265746378.html) CollapsingToolbarLayout为我们提供了一个很方便的顶部 ...
- 关于脚本化css
---恢复内容开始--- 想把自己认为的最重要的,最有用的几块写上,以后会边学边总结完善. 1.首先我们通过JavaScript可以获取到我们想要获取的元素的样式.而这个样式并非单独的哪一个部分的规则 ...
- XMemcached简单使用示例
Memcached的Java客户端目前有三个: Memcached Client for Java 比 SpyMemcached更稳定.更早.更广泛: SpyMemcached 比 Memcached ...