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

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.若example1example2均在多个线程中执行,则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:

示例中,因为类上加锁的原因,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. 7.app和app后端的通讯

    经常有开发者问:app和后端通讯是用http协议还是私有的协议?是用长连接还是短连接?通过阅读本文,帮你解除上面的疑问. (1)是用http协议还是私有的协议? 在间谍电视剧中,经常能看到间谍们的书信 ...

  2. Kafka元数据缓存(metadata cache)

    经常有人问的一个问题就是:Kafka broker到底是不是无状态的?网上有这样的说法: 正常情况下consumer会在消费完一条消息后线性增加这个offset.当然,consumer也可将offse ...

  3. CSS实现核辐射警告标志

    今天做了下360的前端星计划测试题,碰到一个有趣的css题,实现如下图效果,记得上次也是在360面试的时候碰到一个有趣的css实现宝马logo,不得不说360的面试题还是很有创意的. 我一直努力想用一 ...

  4. BZOJ_3282_Tree_LCT

    BZOJ_3282_Tree_LCT Description 给定N个点以及每个点的权值,要你处理接下来的M个操作. 操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询 ...

  5. 实践 Network Policy - 每天5分钟玩转 Docker 容器技术(172)

    为了演示 Network Policy,我们先部署一个 httpd 应用,其配置文件 httpd.yaml 为: httpd 有三个副本,通过 NodePort 类型的 Service 对外提供服务. ...

  6. Spring py登陆模块(包含 记录登陆时间,记录ip,增加积分)

    嘛基于最近的复习准备写个关于spring登陆模块的小程序 虽然小但是五脏俱全呐 话不多说让我来介绍一下今天的登陆程序. 这些是 基于Spring JDBC 的持久层实现 基于Spring 声明事物的业 ...

  7. 肝 hibernate 配置and增删改查 and 测试

    已经通宵三天撸代码了,现在的我已经养成晚上修仙写代码的节奏了.....最近 刚刚复习到了 hibernate 谈谈 这篇文章就谈谈我对这货的理解吧. 在看这篇文章之前希望你 知道sessionfact ...

  8. selenium 元素(class_name、link_text、css_selector)定位方法

    通过元素的定位,使用firebug查找元素 1.示例一,class_name与link_text定位

  9. JAVAEE——SpringMVC第一天:介绍、入门程序、架构讲解、SpringMVC整合MyBatis、参数绑定、SpringMVC和Struts2的区别

    1. 学习计划   第一天 1.SpringMVC介绍 2.入门程序 3.SpringMVC架构讲解 a) 框架结构 b) 组件说明 4.SpringMVC整合MyBatis 5.参数绑定 a) Sp ...

  10. redis与CPU、内存

    任何一个后端应用,包括代码都要考虑对于CPU和内存的影响.redis本质上类似于nodejs,单进程.单线程,事件驱动,但不同的是redis是CPU密集型的.这里列出了redis与内存CPU的相关考虑 ...