java详细剖析
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详细剖析的更多相关文章
- Java基础-使用JAVA代码剖析MD5算法实现过程
Java基础-使用JAVA代码剖析MD5算法实现过程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.
- linux动态库编译和使用详细剖析 - 后续
引言 - 也许是修行 很久以前写过关于动态库科普文章, 废话反正是说了好多. 核心就是在 linux 上面玩了一下 dlopen : ) linux动态库编译和使用详细剖析 - https://www ...
- Java详细指南
Java 基础 并发 JVM Java8 新特性 代码优化 网络 操作系统 数据结构与算法 数据库 系统设计 设计模式 常用框架 网站架构 软件底层 其他 Java 基础 <Head First ...
- [转]Spring注解原理的详细剖析与实现
原文地址:http://freewxy.iteye.com/blog/1149128/ 本文主要分为三部分: 一.注解的基本概念和原理及其简单实用 二.Spring中如何使用注解 三.编码剖析spri ...
- linux动态库编译和使用详细剖析
引言 重点讲述linux上使用gcc编译动态库的一些操作.并且对其深入的案例分析.最后介绍一下动态库插件技术, 让代码向后兼容.关于linux上使用gcc基础编译, 预编译,编译,生成机械码最后链接输 ...
- hadoop namenode启动过程详细剖析及瓶颈分析
NameNode中几个关键的数据结构 FSImage Namenode 会将HDFS的文件和目录元数据存储在一个叫fsimage的二进制文件中,每次保存fsimage之后到下次保存之间的所有hdfs操 ...
- React Native:使用 JavaScript 构建原生应用 详细剖析
数月前,Facebook 对外宣布了正在开发的 React Native 框架,这个框架允许你使用 JavaScript 开发原生的 iOS 应用——就在今天,Beta 版的仓库释出了! 基于 Pho ...
- mysql数据库事务详细剖析
在写之前交代一下背景吧! 做开发也好久了,没怎么整理过知识,现在剖析一下自己对数据库事务的认识,以前用sqlserver,现在转java后又用mysql.oracle.我这块就主要解释一下mysql数 ...
- java 多线程剖析
问题的缘由源自于一道简单的面试题:题目要求如下: 建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC. 解决问题前我们前补充一些基本知识: ...
随机推荐
- PID控制器开发笔记之十三:单神经元PID控制器的实现
神经网络是模拟人脑思维方式的数学模型.神经网络是智能控制的一个重要分支,人们针对控制过程提供了各种实现方式,在本节我们主要讨论一下采用单神经元实现PID控制器的方式. 1.单神经元的基本原理 单神经元 ...
- Elasticsearch为记录添加时间戳timestamp
https://blog.csdn.net/peterwanghao/article/details/76577546
- Redis高可用技术解决方案总结
一.常见使用方式 Redis的几种常见使用方式包括: Redis单副本: Redis多副本(主从): Redis Sentinel(哨兵): Redis Cluster: Redis自研. 二.各种使 ...
- [R]dplyr及ggplot2中的变量引用列的问题
问题描述: 存在这么一个场景,当需要动态选择列作为dplyr或ggplot2的输入时,列名的指定会出现问题. 以iris举例: # 以iris dataset为例 colnames <- c(& ...
- Python-读文件
用python读一个文件,我们一般采用 open('文件名字')这里的文件名可以说完整路径也可以是相对路径(要读取的文件和和代码放在一起) f = open('data.txt')此时我们只是打开了 ...
- 【自动化测试】使用Java+selenium填写验证码成功登录
这是我第一次发博客,若有问题,请多多指教! 本次是为了帮忙解决,如果在平时自动化遇到有验证码填写的情况,我们如何成功登录情况. 思路: 首先我们先将验证码复制并保存成一个图片,然后使用tesserac ...
- python进阶篇
python进阶篇 import 导入模块 sys.path:获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到. import sys ...
- Dreamweaver编辑区下方的属性栏显示
显示属性栏 不小心关闭了Dreamweaver的属性栏,突然用到之后不知道怎么显示,此时需要两步:选择[窗口]工具栏,选择[属性]选项. 此时又可以看到编辑区下方的属性栏了,而且出于编写代码的需要可以 ...
- 归并排序&&归并排序求逆序对
归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用.将已有序的子序列合并,得到完全有序的序 ...
- NOIP-玩具谜题
题目描述 小南有一套可爱的玩具小人,它们各有不同的职业. 有一天,这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外,如下图: 这时 `singer` 告 ...