synchronized的四种作用域以及不能被继承解析
synchronized
是java
中用于同步
的关键字,其典型的作用域如下所示.
1 对象锁
@Slf4j
public class SynchronizedExample1 {
private final int loopNum = 20;
// 修饰一个代码块
private void test1(int j) {
synchronized (this) {
for (int i = 0; i < loopNum; i++) {
log.info("test1 {} - {}", j, i);
}
}
}
// 修饰一个方法
private synchronized void test2(int num) {
for (int i = 0; i < loopNum; i++) {
log.info("test2 {} - {}", num, i);
}
}
public static void main(String[] args) {
SynchronizedExample1 example1 = new SynchronizedExample1();
SynchronizedExample1 example2 = new SynchronizedExample1();
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(() -> {
example1.test2(1);
});
executorService.execute(() -> {
example2.test2(2);
});
executorService.shutdown();
}
}
1.1 代码块修饰(对象)
此时,synchronized
用于保证test1
函数中的被synchronized
大括号包裹的代码同步执行.
synchronized
作用的对象为SynchronizedExample1
的对象实例,例如main
函数中的example1
以及example2
.
Tips:
1.example1
若在多个线程中被调用,其输出顺序将保证同步,按照1,2,3...19,20
的顺序执行.
2.若example1
与example2
均在多个线程中执行,则test1...
之间保持同步输出,test2...
之间保持同步输出,但是test1...
与test2...
之间输出不保证顺序.
1.2 非静态函数修饰
synchronized
添加于test2
函数声明中,其作用类似于1.1
中的代码块修饰,区别点仅仅在于
其同步代码块扩充至整个函数
(test2
).
2. 类锁
@Slf4j
public class SynchronizedExample2 {
private static final int loopNum = 20;
// 修饰一个类
private static void test1(int j) {
synchronized (SynchronizedExample2.class) {
for (int i = 0; i < loopNum; i++) {
log.info("test1 {} - {}", j, i);
}
}
}
// 修饰一个静态方法
private static synchronized void test2(int j) {
for (int i = 0; i < loopNum; i++) {
log.info("test2 {} - {}", j, i);
}
}
public static void main(String[] args) {
SynchronizedExample2 example1 = new SynchronizedExample2();
SynchronizedExample2 example2 = new SynchronizedExample2();
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(() -> {
example1.test1(1);
});
executorService.execute(() -> {
example2.test1(2);
});
}
}
2.1 代码块修饰(类)
与1.1
中区别在于,synchronized
函数修饰的是SynchronizedExample2
类.
SynchronizedExample2
对象,诸如example1
或者example2
在任意多的线程中调用test1
函数,其输出顺序均会被保证(1,2,3,4...19,20
).
2.2 静态函数修饰
功能与2.1
类似,均是对对象加锁,确保多个类对象调用函数时保持顺序.
Tips:
示例中,因为类上加锁的原因,test1
与test2
对象保持顺序执行,不会出现test1...
与test2...
交叉出现的现象.
3 synchronized
不能被继承
需要注意,若synchronized
修饰于函数中,如1.2
以及2.2
,若有类继承于SynchronizedExample1
或者SynchronizedExample1
,子类对象调用test2
不同步.
原因:synchronized
非函数签名,因此无法被继承,所以无法保证子类调用同步.
PS:
如果您觉得我的文章对您有帮助,可以扫码领取下红包,谢谢!
synchronized的四种作用域以及不能被继承解析的更多相关文章
- jsp九大内置对象、四种作用域、跳转方式
jsp有四种属性范围: page -> 页面级别,显然只有在一个页面内可用. request -> 请求级别 服务器跳转,一次请求之后消失. session -> 会话级别 客户端跳 ...
- Javaweb容器的四种作用域
几乎所有web应用容器都提供了四种类似Map的结构:application session request page,Jsp或者Servlet通过向着这四个对象放入数据,从而实现Jsp和Servlet ...
- scope的四种作用域的使用
如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" scope=& ...
- 四种Java线程池用法解析
本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...
- 面试题:四种Java线程池用法解析 !=!=未看
1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? 1 2 3 4 5 6 7 8 new Thread(new Runnable() { @Override ...
- synchronized的四种用法
一 修饰方法 Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起 ...
- java synchronized的四种用法
一 修饰方法 Synchronized修饰一个方法很简单,就是在方法的前面加synchronized,synchronized修饰方法和修饰一个代码块类似,只是作用范围不一样,修饰代码块是大括号括起来 ...
- C和指针 第三章 四种作用域
代码块作用域: 任何位于一对花括号之间是一个代码块,代码块内声明的标识符具有代码块作用域,嵌套代码块内,内部变量会屏蔽外部相同标示的标示符,非嵌套代码块,不会同时处于活动状态所以不会屏蔽. int m ...
- JSP中的四种作用域?
page.request.session和application,具体如下: ①page 代表与一个页面相关的对象和属性. ②request 代表与Web客户机发出的一个请求相关的对象和属性.一个请求 ...
随机推荐
- MongoDB的基本操作(一)
一.简介 mongodb是是由C++语言编写的一个基于分布式文件存储的开源nosql数据库系统,支持文档和键值存储模型,拥有灵活的数据模型.可靠的性能,以及自动的吞吐容 量扩展功能. ...
- centos环境的python、scrapy部署
1 操作系统 Centos 6.5 64bit 或以上版本 2 软件环境 提示:(1)用什么软件:(2)运行环境(3)开发包. Python:Python-2.7.6.tgz Scrapy:Scrap ...
- int i=0;i=i++
package algorithms.com.guan.javajicu; public class Inc { public static void main(String[] args) { In ...
- java8中stream的map和flatmap的理解
转自https://blog.csdn.net/wynjauu/article/details/78741093 假如我们有这样一个需求给定单词列表["Hello","W ...
- req_params.go
, fmt.Sprintf("%s: closing %s", proto, listener.Addr())) }
- Go的context的问题
Go的context的问题 2017-05-29 最近被由context引发的一个bug坑得不轻,所以反思一下Go的context的问题. context是隐式的约束,没有检测 如果我们写一个函数,比 ...
- 【爆料】-《英博夏尔大学毕业证书》BPP一模一样原件
英博夏尔大学毕业证[微/Q:2544033233◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&a ...
- The following untracked working tree files would be overwritten by merge
git pull的时候遇到这样的问题: The following untracked working tree files would be overwritten by merge balabal ...
- 《前端之路》之 Babel 下一代 JavaScript 语法编译器
写本章的内容的出发点主要是 为了对于之前关于 JS 版本的一个总结,在之前的开发中,我们始终对于 ECMAScript 的版本的更新不够重视,以至于在后面的 开发过程中,我们始终会被各种新奇的语法打断 ...
- Asp.Net Core Web应用程序—探索
前言 作为一个Windows系统下的开发者,我对于Core的使用机会几乎为0,但是考虑到微软的战略规划,我觉得,Core还是有先了解起来的必要. 因为,目前微软已经搞出了两个框架了,一个是Net标准( ...