1·类型加载主动初始化和被动初始化两种,通过访问静态变量或者给静态变量赋值都是可以使类初始化,如果有继承关系,所依赖的父类都会被动初始化。

2·如果在类的静态变量中添加final关键字,那这个变量就会被放入当前类的常量池中,删除类源文件以及class字节码都不会影响常量池中的内容,这个是在“编译阶段”完成的;而且在编译之后会生成“助记符”标记常量;
不同助记符所表示的数据类型不同:
ldc表示int,float,String
bipush表示单字节(-128~127)
sipush表示短整型常数(-32768~32767)

3·volatile有两大特性和一个不完美:在禁止指令重排序和多线程修改值可见以外却没有原子特性。
-》volatile由于可以禁止指令重排序,所以单例模式使用doublecheck+volatile变量的方式;
-》如果需要原子特性需要使用Atomic一类对象才能保证原子特性,核心实现是CAS(比较并交换的方式),也就是在JDK的runtime.jar包中的自旋锁来代替sync同步机制。

CAS缺点:(1)自旋锁的思想是一直循环获取执行机会,虽然减少了线程上下文切换,但比较消耗cpu资源,(2)只能保证一个volatil变量的原子性操作。(3)ABA问题(用时间戳标记)
CAS核心代码:每次将值替换回主线程内存前先获取,看与之前的值快照是否相同,相同则更新值(更新值的原子性由cpu指令控制,该操作不可被打断),不同则保存新值后在获取,判断是否相同并替换,通过unSafe对象直接获取该值在内存中的offset,底层调用native的方法。

4·线程不安全集合ArrayList,HashMap,HashSet
ArrayList:
(1)Vector (2)Collections.synchronizedList(new ArrayList()) (3)CopyOnWriteArrayList或CopyOnWriteArraySet代替
(4)ConcurrentHashMap

锁机制:

ReentrantLock: (1)默认非公平锁(不按照顺序,抢到者执行) (2)可重入锁(又称为“递归锁”)

ReentrantReadWriteLock配合lock.newConditon()可以在多个线程间进行等待和唤醒操作。

ReentrantReadWriteLock能保证读取时并发(可以禁止脏读),写时阻塞读写操作,用于读多写少的情况。分别用读锁和写锁。

重入锁:当一个被同步标记的方法中调用另一个被标记同步方法,在获取外层锁的同时内层锁也同时获取;
相当于方法中持有多层lock.lock()和lock.unlock(),也可以同时获得锁;此处lock为同一对象,持有多层lock一定会串行执行。*可重入锁是为了避免程序死锁。

阻塞队列:

java详细剖析的更多相关文章

  1. Java基础-使用JAVA代码剖析MD5算法实现过程

    Java基础-使用JAVA代码剖析MD5算法实现过程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  2. linux动态库编译和使用详细剖析 - 后续

    引言 - 也许是修行 很久以前写过关于动态库科普文章, 废话反正是说了好多. 核心就是在 linux 上面玩了一下 dlopen : ) linux动态库编译和使用详细剖析 - https://www ...

  3. Java详细指南

    Java 基础 并发 JVM Java8 新特性 代码优化 网络 操作系统 数据结构与算法 数据库 系统设计 设计模式 常用框架 网站架构 软件底层 其他 Java 基础 <Head First ...

  4. [转]Spring注解原理的详细剖析与实现

    原文地址:http://freewxy.iteye.com/blog/1149128/ 本文主要分为三部分: 一.注解的基本概念和原理及其简单实用 二.Spring中如何使用注解 三.编码剖析spri ...

  5. linux动态库编译和使用详细剖析

    引言 重点讲述linux上使用gcc编译动态库的一些操作.并且对其深入的案例分析.最后介绍一下动态库插件技术, 让代码向后兼容.关于linux上使用gcc基础编译, 预编译,编译,生成机械码最后链接输 ...

  6. hadoop namenode启动过程详细剖析及瓶颈分析

    NameNode中几个关键的数据结构 FSImage Namenode 会将HDFS的文件和目录元数据存储在一个叫fsimage的二进制文件中,每次保存fsimage之后到下次保存之间的所有hdfs操 ...

  7. React Native:使用 JavaScript 构建原生应用 详细剖析

    数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天,Beta 版的仓库释出了! 基于 Pho ...

  8. mysql数据库事务详细剖析

    在写之前交代一下背景吧! 做开发也好久了,没怎么整理过知识,现在剖析一下自己对数据库事务的认识,以前用sqlserver,现在转java后又用mysql.oracle.我这块就主要解释一下mysql数 ...

  9. java 多线程剖析

    问题的缘由源自于一道简单的面试题:题目要求如下: 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC. 解决问题前我们前补充一些基本知识: ...

随机推荐

  1. [51nod1965]奇怪的式子

    noteskey 怎么说,魔性的题目...拿来练手 min_25 正好...吧 首先就是把式子拆开来算贡献嘛 \[ANS=\prod_{i=1}^n \sigma_0(i)^{\mu(i)} \pro ...

  2. 【python】md5加密方法相关使用

    md5方法在hashlib库中,使用前需要先导入.它的主要方法为update,copy,以及转换为二进制,十六进制. 用法说明: Help on HASH object: class HASH(bui ...

  3. 【原创】大叔经验分享(7)创建hive表时格式如何选择

    常用格式 textfile 需要定义分隔符,占用空间大,读写效率最低,非常容易发生冲突(分隔符)的一种格式,基本上只有需要导入数据的时候才会使用,比如导入csv文件: ROW FORMAT DELIM ...

  4. Axis接口

    Axis支持三种web service的部署和开发,分别为: 1.Dynamic Invocation Interface ( DII) 2.Dynamic Proxy方式 3.Stubs方式Dyna ...

  5. Git使用七:修改最后一次提交、删除文件和重命名文件

    修改最后一次提交: 在实际开发中,可能会遇到以下两种情景:情景一:版本刚一提交(commit)到仓库,突然想起漏掉两个文件还没有添加(add).情景二:版本刚一提交(commit)到仓库,突然想起版本 ...

  6. vue中html模板使用绑定的全局函数

    我们知道在script中使用vue绑定的全局函数时, 我们需要用这种方式使用: this.Util.Fun(e) 那在模板中, 比如v-if中想使用Fun函数怎么办呢?你应该这样做 <i v-i ...

  7. 关于 win10 系统中 Anaconda3 中修改 Jupyter Notebook 默认启动目录

    目标: 修改Anaconda3中自带的Jupyter Notebook默认启动目录. 步骤:     1.提前创建好你想要启动位置文件夹.     2.寻找配置文件,"jupyter_not ...

  8. 源码安装cx_Oracle(适合离线环境)

    cd ~/tools unzip instantclient-basic-linux.x64-12.2.0.1.0.zip mv instantclient_12_2 /opt/ export ORA ...

  9. vue 获取dom的css属性值

    <template> <div id="topInfo" ref="topInfo" style="width: 200px;hei ...

  10. ISP PIPLINE (五) Denoise

    what is the Denoise? Denoise就是图像去噪,平滑图像,并保留图像细节. why does Denoise? 图像在采集并转换为数字信号的过程会引入一些噪声,这些噪声会让图片看 ...