synchronized

互联网架构师学习笔记整理

狂风中的少年 提交于 2020-01-21 16:32:30
互联网架构师学习笔记整理-完善中 一、并发编程 + ActiveMQ + 实战案例 并发编程基础篇 第一天 1、课程大纲简要介绍 2、线程基础概念、线程安全概念、多个线程多个锁概念 3、对象锁的同步和异步 4、脏读概念、脏读业务场景 5、Synchronized概念、Synchronized代码块、Synchronized其他细节 第二天 1、Volatile关键字概念、线程优化执行流程、内部原理讲解 2、Volatile关键字的非原子性 3、并发编程下的多线程间通信概念wait、notify,线程经典面试题讲解 4、模拟底层阻塞队列(queue)实现讲解 5、单例和多线程如何结合使用 并发编程中级篇 第三天 1、同步类容器讲解 2、并发类容器讲解 3、Concurrent集合类讲解与底层原理实现 4、CopyOnWrite集合类讲解与底层原理实现 5、各类并发Queue详细讲解 第四天 1、多线程设计模式之Future模式讲解与模拟实现 2、多线程设计模式之Master-Worker模式讲解与模拟实现 3、多线程设计模式之生产消费者模型讲解与模拟实现 并发编程高级篇 第五天 1、JDK多任务执行框架底层讲解与内部实现 2、默认线程池说明、底层代码讲解 3、自定义线程池说明、底层代码讲解 4、线程池拒绝策略讲解 5

互联网架构师学习笔记整理

耗尽温柔 提交于 2020-01-21 15:52:01
互联网架构师学习笔记整理-完善中 一、并发编程 + ActiveMQ + 实战案例 并发编程基础篇 第一天 1、课程大纲简要介绍 2、线程基础概念、线程安全概念、多个线程多个锁概念 3、对象锁的同步和异步 4、脏读概念、脏读业务场景 5、Synchronized概念、Synchronized代码块、Synchronized其他细节 第二天 1、Volatile关键字概念、线程优化执行流程、内部原理讲解 2、Volatile关键字的非原子性 3、并发编程下的多线程间通信概念wait、notify,线程经典面试题讲解 4、模拟底层阻塞队列(queue)实现讲解 5、单例和多线程如何结合使用 并发编程中级篇 第三天 1、同步类容器讲解 2、并发类容器讲解 3、Concurrent集合类讲解与底层原理实现 4、CopyOnWrite集合类讲解与底层原理实现 5、各类并发Queue详细讲解 第四天 1、多线程设计模式之Future模式讲解与模拟实现 2、多线程设计模式之Master-Worker模式讲解与模拟实现 3、多线程设计模式之生产消费者模型讲解与模拟实现 并发编程高级篇 第五天 1、JDK多任务执行框架底层讲解与内部实现 2、默认线程池说明、底层代码讲解 3、自定义线程池说明、底层代码讲解 4、线程池拒绝策略讲解 5

总结1.13

青春壹個敷衍的年華 提交于 2020-01-21 05:13:48
两个对象值相同(x.equals(y) == true),hash code是否可以不相等? 不能,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。Java对于eqauls方法和hashCode方法是这样规定的: (1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同; (2)如果两个对象的hashCode相同,它们并不一定相同。 ArrayList和Vector(Vector)是线程安全,插入时(ArrayList)性能好? char型变量中能否存储一个中文汉字?原因是? 能够存储一个中文汉字,因为java中以unicode编码,一个char占16个字节 ###当一个线程进入一个对象的一个synchronized方法后,其他线程是否可以进入此对象的其他方法? 可以进入其他非synchronized的方法,synchronized的方法不可以的! try{}里有一个return语句,那么紧跟在这个try后面的finally{}里的代码会不会被执行?什么时候执行,在return之前还是后? finally中的代码比return和break语句后执行 jsp中request、session、application、page作用域从小到大顺序依次为: page<request<session

转 Java 208道面试题及部分答案 补充部分答案

元气小坏坏 提交于 2020-01-20 08:41:26
转自 https://www.cnblogs.com/chen1005/p/10481102.html ---恢复内容开始--- 一、Java 基础 1.JDK 和 JRE 有什么区别? 答:JRE是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。   JDK是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的 2.== 和 equals 的区别是什么? 答:==是比较两个对象的地址,equals是比较连个对象的内容 3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗? 答:不对!hashCode()相同,不代表连个对象就相同。hashCode值是从hash表中得来的,hash是一个函数,该函数的实现是一种算法,通过hash算法算出hash值,hash表就是 hash值组成的,一共有8个位置。   相反,equals()相同,hashCode()一定相同。这个是正确的! 4.final 在 java 中有什么作用? 答: final的作用随着所修饰的类型而不同: final修饰类中的属性或者变量:无论属性是基本类型还是引用类型, final所起的作用都是变量里面存放的“值”不能变

synchronized基于内存语义的工作原理(二)

流过昼夜 提交于 2020-01-20 04:54:48
基于 工作原理一 可知同步关键字底层是基于JVM操作监视器的同步指令原语monitorenter和monitorexit来实现,这次将会通过抽象的内存语义来说明侧面说明加锁和解锁的方式 1. 工作内存与主内存 定义 主内存: 一般就是计算机操作系统上的物理内存,简言之,即使一般我们所说的计算机的内存含义 工作内存: 基于JMM(Java内存模型)规范规定,线程使用的变量将会把主内存的数据变量复制到自己线程栈的工作空间 线程工作内存与主内存的读写示意图 前面已经有介绍到 CPU高速缓存的知识点 ,以下是CPU简单的架构图以及工作内存与主内存的读写流程 从上述我们可以看到,CPU中包含L1-L3的Cache,线程每次读写都需要先经过CPU高速缓存,这样便会产生数据缓存的不一致,前面已经有讲到CPU厂商针对这类问题做了改进,运用缓存一致性来达到最终数据的一致性,那么此时如果有一个需求是强一致性,即使是很短的时间内,我也需要保证写数据之后立马看到写数据成功后的效果,这时候怎么办呢?在JMM规范中为了解决这类内存共享的数据在不同线程不可见的问题,就制定一种规范来强制java程序中的线程直接跳过CPU高速缓存数据去读取主内存的数据,这就是解决内存数据的不可见的一种手段. 2. synchronized的代码演示 场景: 现在有一个共享变量sharedVar,thread

volitale 怎么保证可见性

醉酒当歌 提交于 2020-01-20 04:53:51
VOLATILE 只保证可见性,并不保证原子性 在说明Java多线程内存可见性之前,先来简单了解一下Java内存模型。 (1)Java所有变量都存储在主内存中 (2)每个线程都有自己独立的工作内存,里面 存该线程的使用到的变量副本(该副本就是主内存中该变量的一份拷贝) (1)线程对共享变量的所有操作都必须在自己的工作内存中进行,不能直接在主内存中读写 (2)不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量值的传递需要通过主内存来完成。 线程1对共享变量的修改,要想被线程2及时看到,必须经过如下2个过程: (1)把工作内存1中更新过的共享变量刷新到主内存中 (2)将主内存中最新的共享变量的值更新到工作内存2中 可见性与原子性 可见性:一个线程对共享变量的修改,更够及时的被其他线程看到 原子性:即不可再分了,不能分为多步操作。比如赋值或者return。比如"a = 1;"和 "return a;"这样的操作都具有原子性。类似"a += b"这样的操作不具有原子性,在某些JVM中"a += b"可能要经过这样三个步骤: ① 取出a和b ② 计算a+b ③ 将计算结果写入内存 Synchronized:保证可见性和原子性 Synchronized能够实现原子性和可见性,在Java内存模型中,synchronized规定,线程在加锁时,先清空工作内存

What is the difference between a synchronized function and synchronized block? [duplicate]

♀尐吖头ヾ 提交于 2020-01-19 17:36:46
问题 This question already has answers here : What is the difference between a synchronized method and synchronized block in Java? [duplicate] (6 answers) Closed 2 years ago . what is the difference between public synchronized void addition() { //something; } and public void addtion() { synchronized (//something) { //something; } } If I am wrong Ignore this question. 回答1: it the first one only one thread can execute whole method at a time whereas in second one only one thread can execute that

What is the difference between a synchronized function and synchronized block? [duplicate]

∥☆過路亽.° 提交于 2020-01-19 17:36:46
问题 This question already has answers here : What is the difference between a synchronized method and synchronized block in Java? [duplicate] (6 answers) Closed 2 years ago . what is the difference between public synchronized void addition() { //something; } and public void addtion() { synchronized (//something) { //something; } } If I am wrong Ignore this question. 回答1: it the first one only one thread can execute whole method at a time whereas in second one only one thread can execute that

What is the difference between a synchronized function and synchronized block? [duplicate]

為{幸葍}努か 提交于 2020-01-19 17:35:56
问题 This question already has answers here : What is the difference between a synchronized method and synchronized block in Java? [duplicate] (6 answers) Closed 2 years ago . what is the difference between public synchronized void addition() { //something; } and public void addtion() { synchronized (//something) { //something; } } If I am wrong Ignore this question. 回答1: it the first one only one thread can execute whole method at a time whereas in second one only one thread can execute that

JUC(java.util.concurrent)

不羁的心 提交于 2020-01-19 04:45:17
在 Java 5.0 提供了 java.util.concurrent (简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。提供可调的、灵活的线程池。还提供了设计用于多线程上下文中的 Collection 实现等。 一、volatile关键字、内存可见性 内存可见性 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。 可见性错误是指当读操作与写操作在不同的线程中执行时,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。 我们可以通过同步来保证对象被安全地发布。除此之外我们也可以使用一种更加轻量级的 volatile 变量。 volatile 关键字 Java 提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程,可以保证内存中的数据可见。可以将 volatile 看做一个轻量级的锁,但是又与锁有些不同: 对于多线程,不是一种互斥关系 不能保证变量状态的“原子性操作” public class TestVolatile { public static void main(String[] args