android synchronized的使用
今天,简单讲讲
synchronized 的使用。
synchronized 是Java语言关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。
本文直接以代码的形式来展示 synchronized 关键字的使用:
一.synchronized 的简单示例
【1】synchronized Demo1:
package com.andyidea.demo;/*** 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,* 一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码* 块以后才能执行该代码块。* @author Andy.Chen**/
public class Thread01 implements Runnable {@Overridepublic void run() {synchronized (this) {for(int i=0;i<3;i++){System.out.println(Thread.currentThread().getName()+" synchronized loop "+i);}}}public static void main(String[] args) {Thread01 t01 = new Thread01();System.out.println("Welcome to Andy.Chen Blog! \n"+"synchronized 关键字使用 \n"+"--------------------------");Thread ta = new Thread(t01,"A");Thread tb = new Thread(t01,"B");ta.start();tb.start();}}
运行结果如下:
Welcome to Andy.Chen Blog!
synchronized 关键字使用
--------------------------
B synchronized loop 0
B synchronized loop 1
B synchronized loop 2
A synchronized loop 0
A synchronized loop 1
A synchronized loop 2
【2】synchronized Demo2:
package com.andyidea.demo;/*** 当一个线程访问object的一个synchronized(this)同步代码块时,* 另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。* @author Andy.Chen**/
public class Thread02 {public void method01(){synchronized (this) {int i=0;while(i++ < 3){System.out.println(Thread.currentThread().getName() +":"+ i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}public void method02(){//第1种方式:当一个线程访问object的一个synchronized(this)同步代码块时,//另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
// int j=0;
// while(j++ < 3){
// System.out.println(Thread.currentThread().getName() +":"+ j);
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }//第2种方式:当一个线程访问object的一个synchronized(this)同步代码块时,//其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。synchronized (this) {int j=0;while(j++ < 3){System.out.println(Thread.currentThread().getName() +":"+ j);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}}/*** 当一个线程访问object的一个synchronized(this)同步代码块时,* 它就获得了这个object的对象锁。* 结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。*/public synchronized void method3(){int k=0;while(k++ < 3){System.out.println(Thread.currentThread().getName() +":"+ k);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {final Thread02 t02 = new Thread02();System.out.println("Welcome to Andy.Chen Blog! \n"+"synchronized 关键字使用 \n"+"--------------------------");Thread t02A = new Thread(new Runnable() {@Overridepublic void run() {t02.method01();}},"A");Thread t02B = new Thread(new Runnable() {@Overridepublic void run() {t02.method02();}},"B");Thread t02C = new Thread(new Runnable() {@Overridepublic void run() {t02.method3();}},"C");t02A.start();t02B.start();t02C.start();}}
运行结果如下:
Welcome to Andy.Chen Blog!
synchronized 关键字使用
--------------------------
B:1
B:2
B:3
C:1
C:2
C:3
A:1
A:2
A:3
二.synchronized与static synchronized 的区别
1.synchronized与static synchronized 的区别
synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是“类的当前实例”, 类的两个不同实例就没有这种约束了。那么static synchronized恰好就是要控制类的所有实例的访问了,static synchronized是限制线程同时访问jvm中该类的所有实例同时访问对应的代码快。实际上,在类中某方法或某代码块中有 synchronized,那么在生成一个该类实例后,改类也就有一个监视快,放置线程并发访问改实例synchronized保护快,而static synchronized则是所有该类的实例公用一个监视快了,也也就是两个的区别了,也就是synchronized相当于 this.synchronized,而
static synchronized相当于Something.synchronized.
一个日本作者-结成浩的《java多线程设计模式》有这样的一个列子:
pulbic class Something(){
public synchronized void isSyncA(){}
public synchronized void isSyncB(){}
public static synchronized void cSyncA(){}
public static synchronized void cSyncB(){}
}
那么,加入有Something类的两个实例a与b,那么下列组方法何以被1个以上线程同时访问呢
a. x.isSyncA()与x.isSyncB()
b. x.isSyncA()与y.isSyncA()
c. x.cSyncA()与y.cSyncB()
d. x.isSyncA()与Something.cSyncA()
这里,很清楚的可以判断:
a,都是对同一个实例的synchronized域访问,因此不能被同时访问
b,是针对不同实例的,因此可以同时被访问
c,因为是static synchronized,所以不同实例之间仍然会被限制,相当于Something.isSyncA()与 Something.isSyncB()了,因此不能被同时访问。
那么,第d呢?,书上的 答案是可以被同时访问的,答案理由是synchronzied的是实例方法与synchronzied的类方法由于锁定(lock)不同的原因。
个人分析也就是synchronized 与static synchronized 相当于两帮派,各自管各自,相互之间就无约束了,可以被同时访问。目前还不是分清楚java内部设计synchronzied是怎么样实现的。
结论:A: synchronized static是某个类的范围,synchronized static cSync{}防止多个线程同时访问这个 类中的synchronized static 方法。它可以对类的所有对象实例起作用。
B: synchronized 是某实例的范围,synchronized isSync(){}防止多个线程同时访问这个实例中的synchronized 方法。
2.synchronized方法与synchronized代码快的区别
synchronized methods(){} 与synchronized(this){}之间没有什么区别,只是 synchronized methods(){} 便于阅读理解,而synchronized(this){}可以更精确的控制冲突限制访问区域,有时候表现更高效率。
3.synchronized关键字是不能继承的
这个在http://www.learndiary.com/archives/diaries/2910.htm一文中看到的,我想这一点也是很值得注意的,继承时子类的覆盖方法必须显示定义成synchronized.
android synchronized的使用就讲完了。
就这么简单。
android synchronized的使用相关推荐
- Android Synchronized 关键字学习
面试官:能说说 Synchronized 吗? 答:Synchronized 是Java的一个关键字,使用于多线程并发环境下,可以用来修饰实例对象和类对象,确保在同一时刻只有一个线程可以访问被Sync ...
- Android 11 PackageManagerService源码分析(一):PMS启动的总体流程
本文并非从上帝视角来描述PMS的总体设计和运行逻辑,而是记录本人阅读源码的一个过程.分析到后面才会出总结性的文章. 1. PMS概述 PMS是Android系统中负责安装包管理的服务,它的主要职责如下 ...
- [深入理解Android卷二 全文-第四章]深入理解PackageManagerService
由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第 ...
- 基于Android P版本PKMS详解二
由以上代码可知,`PKMS` 扫描了很多目录,下面列举几个重点说明: ✨ /system/framework :该目录中的文件都是系统库,例如:framework.jar.services.jar.f ...
- Android PackageManagerService分析一:PMS的启动
从这一章开始,我们来分析Android的PackageManagerService,后面简称PMS.PMS用来管理所有的package信息,包括安装.卸载.更新以及解析AndroidManifest. ...
- Android 源码 installPackage 流程分析
installPackage 安装流程最终会调用 PackageManagerService 对应方法,当然是使用 binder 机制得以实现跨进程通信. 先来看看 installPackage 流程 ...
- PMS-adb install安装应用流程(Android L)
第一次画流程图画的不好 通过adb install安装应用时对framework来说会首先调用Pm.java的runInstall()方法 private int runInstall(){int i ...
- 一篇文章看明白 Android PackageManagerService 工作流程
Android - PackageMangerService 分析 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 ...
- Android 13 NavigationBar
Android 13 NavigationBar流程 一.概述 Android SystemUI之NavigationBar packages/apps/Settings/src/com/androi ...
最新文章
- 团购网站的兴衰与启示
- ADO.NET学习笔记-非链接类
- Linker Tools Error LNK2001 报错
- MySQL无法修改字段
- uva 12508 - Triangles in the Grid(几何+计数)
- JSF的web.xml配置
- CodeActivity基本使用
- 软件测试有没有测试大纲文档,系统测试大纲(范例).docx
- burpsuite破解版
- react学习(45)----react组件
- python序列类型包括哪三种映射类型_python序列类型包括哪三种
- 计蒜客 第一场 搜狗输入法
- [转载]使用Java将Word转为Html或txt!
- 转自 静心梦工厂
- 学习Bit Twiddling Hacks
- 网络训练时出现loss为nan的情况(已解决)
- nginx 访问图片404_Nginx学习笔记(二、Nginx配置文件详解) - 被猪附身的人
- 迅为瑞芯微3399开发板Ubuntu系统-安装ssh
- Orleans学习入门(最近公司要用奥尔良,特此记录下学习过程,希望各大神多指教)...
- iOS Core Bluetooth_1 概述
热门文章
- SpringAop对struts2的Action设置切面织入时报错java.lang.NoSuchMethodException
- 【bzoj4372】烁烁的游戏 动态点分治+线段树
- 爬取京东商品分类和链接
- [单选题]PDO::ATTR_ERRMODE设置为以下哪个值时,PDO会抛出PDOException?
- 让LoadRunner再次走下神坛
- Android Activity学习笔记——Activity的启动和创建
- Repeater 绑定下拉列表
- Cucumber入门之_argument
- 互联网发展趋势:社区化、碎片化、一站式、寒冬
- Spring学习(二)Spring IoC 和 DI 简介