synchronizedjava中用于同步的关键字,其典型的作用域如下所示.

1 对象锁


  1. @Slf4j
  2. public class SynchronizedExample1 {
  3. private final int loopNum = 20;
  4. // 修饰一个代码块
  5. private void test1(int j) {
  6. synchronized (this) {
  7. for (int i = 0; i < loopNum; i++) {
  8. log.info("test1 {} - {}", j, i);
  9. }
  10. }
  11. }
  12. // 修饰一个方法
  13. private synchronized void test2(int num) {
  14. for (int i = 0; i < loopNum; i++) {
  15. log.info("test2 {} - {}", num, i);
  16. }
  17. }
  18. public static void main(String[] args) {
  19. SynchronizedExample1 example1 = new SynchronizedExample1();
  20. SynchronizedExample1 example2 = new SynchronizedExample1();
  21. ExecutorService executorService = Executors.newCachedThreadPool();
  22. executorService.execute(() -> {
  23. example1.test2(1);
  24. });
  25. executorService.execute(() -> {
  26. example2.test2(2);
  27. });
  28. executorService.shutdown();
  29. }
  30. }

1.1 代码块修饰(对象)

此时,synchronized用于保证test1函数中的被synchronized大括号包裹的代码同步执行.

synchronized作用的对象为SynchronizedExample1的对象实例,例如main函数中的example1以及example2.

Tips:

1.example1若在多个线程中被调用,其输出顺序将保证同步,按照1,2,3...19,20的顺序执行.

2.若example1example2均在多个线程中执行,则test1...之间保持同步输出,test2...之间保持同步输出,但是test1...test2...之间输出不保证顺序.

1.2 非静态函数修饰

synchronized添加于test2函数声明中,其作用类似于1.1中的代码块修饰,区别点仅仅在于其同步代码块扩充至整个函数(test2).

2. 类锁

  1. @Slf4j
  2. public class SynchronizedExample2 {
  3. private static final int loopNum = 20;
  4. // 修饰一个类
  5. private static void test1(int j) {
  6. synchronized (SynchronizedExample2.class) {
  7. for (int i = 0; i < loopNum; i++) {
  8. log.info("test1 {} - {}", j, i);
  9. }
  10. }
  11. }
  12. // 修饰一个静态方法
  13. private static synchronized void test2(int j) {
  14. for (int i = 0; i < loopNum; i++) {
  15. log.info("test2 {} - {}", j, i);
  16. }
  17. }
  18. public static void main(String[] args) {
  19. SynchronizedExample2 example1 = new SynchronizedExample2();
  20. SynchronizedExample2 example2 = new SynchronizedExample2();
  21. ExecutorService executorService = Executors.newCachedThreadPool();
  22. executorService.execute(() -> {
  23. example1.test1(1);
  24. });
  25. executorService.execute(() -> {
  26. example2.test1(2);
  27. });
  28. }
  29. }

2.1 代码块修饰(类)

1.1中区别在于,synchronized函数修饰的是SynchronizedExample2类.

SynchronizedExample2对象,诸如example1或者example2在任意多的线程中调用test1函数,其输出顺序均会被保证(1,2,3,4...19,20).

2.2 静态函数修饰

功能与2.1类似,均是对对象加锁,确保多个类对象调用函数时保持顺序.

Tips:

示例中,因为类上加锁的原因,test1test2对象保持顺序执行,不会出现test1...test2...交叉出现的现象.

3 synchronized不能被继承

需要注意,若synchronized修饰于函数中,如1.2以及2.2,若有类继承于SynchronizedExample1或者SynchronizedExample1,子类对象调用test2不同步.

原因:synchronized非函数签名,因此无法被继承,所以无法保证子类调用同步.

PS:

如果您觉得我的文章对您有帮助,可以扫码领取下红包,谢谢!

synchronized的四种作用域以及不能被继承解析的更多相关文章

  1. jsp九大内置对象、四种作用域、跳转方式

    jsp有四种属性范围: page -> 页面级别,显然只有在一个页面内可用. request -> 请求级别 服务器跳转,一次请求之后消失. session -> 会话级别 客户端跳 ...

  2. Javaweb容器的四种作用域

    几乎所有web应用容器都提供了四种类似Map的结构:application session request page,Jsp或者Servlet通过向着这四个对象放入数据,从而实现Jsp和Servlet ...

  3. scope的四种作用域的使用

    如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" scope=& ...

  4. 四种Java线程池用法解析

    本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...

  5. 面试题:四种Java线程池用法解析 !=!=未看

    1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 2 3 4 5 6 7 8 new Thread(new Runnable() {     @Override ...

  6. synchronized的四种用法

    一 修饰方法  Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起 ...

  7. java synchronized的四种用法

    一 修饰方法 Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来 ...

  8. C和指针 第三章 四种作用域

    代码块作用域: 任何位于一对花括号之间是一个代码块,代码块内声明的标识符具有代码块作用域,嵌套代码块内,内部变量会屏蔽外部相同标示的标示符,非嵌套代码块,不会同时处于活动状态所以不会屏蔽. int m ...

  9. JSP中的四种作用域?

    page.request.session和application,具体如下: ①page 代表与一个页面相关的对象和属性. ②request 代表与Web客户机发出的一个请求相关的对象和属性.一个请求 ...

随机推荐

  1. MyEclipse代码提示设置

    (一)普通代码提示 1. 打开MyEclipse ,然后"window"→"Preferences" 2. 选择"java",展开,&quo ...

  2. canvas学习笔记(一)

    canvas是HTML5的新元素之一.使用canvas可以直接在HTML上进行图形操作,所以它具有极大的应用价值.canvas元素本身不具有绘图能力,它需要借助JavaScript来实现绘图功能. c ...

  3. Centos7下安装PHP5.5,5.6,7.0----(转载记录一下)

    由于centOS7 默认的php版本是5.4的,偏低,所以收录了一下怎样安装5.5/5.6/7.0版本 默认的版本太低了,手动安装有一些麻烦,想采用Yum安装的可以使用下面的方案: 1.检查当前安装的 ...

  4. 一次完整的HTTP网络请求过程详解

    0.  前言 从我们在浏览器的地址栏输入http://blog.csdn.net/seu_calvin后回车,到我们看到该博客的主页,这中间经历了什么呢?简单地回答这个问题,大概是经历了域名解析.TC ...

  5. stack的empty()

    public static void main(String[] args) { Stack stack=null; System.out.println("1."+stack.e ...

  6. bzoj4044 [Cerc2014] Virus synthesis

    回文自动机上dp f[x]表示形成x代表的回文串所需的最小步数, 若len[x]为奇数,f[x]=len[x],因为即使有更优的,也是直接添加,没有复制操作,那样就不用从x转移了. 若len[x]为偶 ...

  7. bzoj 2005 能量采集 莫比乌斯反演

    我们要求的是∑ni=1∑mj=1(2×gcd(i,j)−1) 化简得2×∑ni=1∑mj=1gcd(i,j)−n×m 所以我们现在只需要求出∑ni=1∑mj=1gcd(i,j)即可 ∑ni=1∑mj= ...

  8. 【最小生成树+子集枚举】Uva1151 Buy or Build

    Description 平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方. 另外还有q(0<=q< ...

  9. VMware workstation创建虚拟机console

    1. 使用VMware workstation创建虚拟机硬件2. 安装操作系统3. 操作系统安装过程 1. 使用VMware workstation创建虚拟机硬件 使用VMware workstati ...

  10. Laravel分页带参数的实现方法

    控制器: $data['type'] = 5;$data['member_list'] = Member::orderBy('id', 'desc')->paginate(10);return ...