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. 解决问题前我们前补充一些基本知识: ...
随机推荐
- Android Studio项目Gradle内网配置
由于内网无法连接到外部网络,在使用Gradle编译Android Studio项目时就会面临一些问题: 1.Gradle安装文件无法下载 2.Gradle Android插件无法下载 3.项目依赖文件 ...
- Java中输入判定的错误和纠正
在编程过程中,很多技术人员看重程序的简洁性,效率性和包容性.其中最容易问到的就是假如输入数据不符合要求时的程序处理,这也是很多公司的机试题中应聘人员写出了符合功能要求的程序却并未通过面试的原因.下面是 ...
- win10安装mysql5.7.20解压版
mysql安装包可到官网下载,地址:https://dev.mysql.com/downloads/mysql 1.首先解压文件包,我这解压到E:\install_work\mysql目录下: 2.发 ...
- SpringMVC的入门示例---基于注解的配置
注解版的配置,主要的修改就是将原来使用<bean>创建的业务控制器对象,修改为是扫描标签扫描到容器. 1.导入包 2.在 web.xml 配置核心控制器 <?xml version= ...
- Sprite组件和Button组件的使用
一.Sprint组件的使用 1.游戏中显示一张图片,通常我们称之为"精灵" sprite 2.cocos creator如果需要显示一个图片,那么需要在节点上挂一个精灵组件,为这个 ...
- C# .Net String字符串效率提高-字符串拼接
字符串操作是编程中非常频繁的操作,特别是在拼接字符串的时候.下面来说说字符串拼接的效率提升. 1. 减少装箱 值类型与引用类型之间的转换存在装箱与拆箱操作:将值类型转换成引用类型的操作叫装箱,将引用类 ...
- 【C++ Primer | 09】容器适配器
一.stack s.push(): 向栈内压入一个成员: s.pop(): 从栈顶弹出一个成员: s.empty(): 如果栈为空返回true,否则返回false: s.top(): 返回栈顶,但不删 ...
- sklearn交叉验证-【老鱼学sklearn】
交叉验证(Cross validation),有时亦称循环估计, 是一种统计学上将数据样本切割成较小子集的实用方法.于是可以先在一个子集上做分析, 而其它子集则用来做后续对此分析的确认及验证. 一开始 ...
- Python中防止sql注入的方法详解
SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库.下面这篇文章主要给大家介绍了关于Python中 ...
- springboot 启动排除某些bean 的注入
问题: 最近做项目的时候,需要引入其他的jar.然后还需要扫描这些jar里的某些bean.于是使用注解:@ComponentScan这个注解直接指定包名就可以,它会去扫描这个包下所有的class,然后 ...