今天,简单讲讲



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的使用相关推荐

  1. Android Synchronized 关键字学习

    面试官:能说说 Synchronized 吗? 答:Synchronized 是Java的一个关键字,使用于多线程并发环境下,可以用来修饰实例对象和类对象,确保在同一时刻只有一个线程可以访问被Sync ...

  2. Android 11 PackageManagerService源码分析(一):PMS启动的总体流程

    本文并非从上帝视角来描述PMS的总体设计和运行逻辑,而是记录本人阅读源码的一个过程.分析到后面才会出总结性的文章. 1. PMS概述 PMS是Android系统中负责安装包管理的服务,它的主要职责如下 ...

  3. [深入理解Android卷二 全文-第四章]深入理解PackageManagerService

    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第 ...

  4. 基于Android P版本PKMS详解二

    由以上代码可知,`PKMS` 扫描了很多目录,下面列举几个重点说明: ✨ /system/framework :该目录中的文件都是系统库,例如:framework.jar.services.jar.f ...

  5. Android PackageManagerService分析一:PMS的启动

    从这一章开始,我们来分析Android的PackageManagerService,后面简称PMS.PMS用来管理所有的package信息,包括安装.卸载.更新以及解析AndroidManifest. ...

  6. Android 源码 installPackage 流程分析

    installPackage 安装流程最终会调用 PackageManagerService 对应方法,当然是使用 binder 机制得以实现跨进程通信. 先来看看 installPackage 流程 ...

  7. PMS-adb install安装应用流程(Android L)

    第一次画流程图画的不好 通过adb install安装应用时对framework来说会首先调用Pm.java的runInstall()方法 private int runInstall(){int i ...

  8. 一篇文章看明白 Android PackageManagerService 工作流程

    Android - PackageMangerService 分析 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 ...

  9. Android 13 NavigationBar

    Android 13 NavigationBar流程 一.概述 Android SystemUI之NavigationBar packages/apps/Settings/src/com/androi ...

最新文章

  1. 团购网站的兴衰与启示
  2. ADO.NET学习笔记-非链接类
  3. Linker Tools Error LNK2001 报错
  4. MySQL无法修改字段
  5. uva 12508 - Triangles in the Grid(几何+计数)
  6. JSF的web.xml配置
  7. CodeActivity基本使用
  8. 软件测试有没有测试大纲文档,系统测试大纲(范例).docx
  9. burpsuite破解版
  10. react学习(45)----react组件
  11. python序列类型包括哪三种映射类型_python序列类型包括哪三种
  12. 计蒜客 第一场 搜狗输入法
  13. [转载]使用Java将Word转为Html或txt!
  14. 转自 静心梦工厂
  15. 学习Bit Twiddling Hacks
  16. 网络训练时出现loss为nan的情况(已解决)
  17. nginx 访问图片404_Nginx学习笔记(二、Nginx配置文件详解) - 被猪附身的人
  18. 迅为瑞芯微3399开发板Ubuntu系统-安装ssh
  19. Orleans学习入门(最近公司要用奥尔良,特此记录下学习过程,希望各大神多指教)...
  20. iOS Core Bluetooth_1 概述

热门文章

  1. SpringAop对struts2的Action设置切面织入时报错java.lang.NoSuchMethodException
  2. 【bzoj4372】烁烁的游戏 动态点分治+线段树
  3. 爬取京东商品分类和链接
  4. [单选题]PDO::ATTR_ERRMODE设置为以下哪个值时,PDO会抛出PDOException?
  5. 让LoadRunner再次走下神坛
  6. Android Activity学习笔记——Activity的启动和创建
  7. Repeater 绑定下拉列表
  8. Cucumber入门之_argument
  9. 互联网发展趋势:社区化、碎片化、一站式、寒冬
  10. Spring学习(二)Spring IoC 和 DI 简介