自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(39)
  • 收藏
  • 关注

转载 线程应用:(十)ThreadLocal

一、应用场景举例  每个线程都应该有自己的数据库连接Connection,不能被其他线程所影响,就可以使用ThreadLocal(一个线程内各模块间共享同一数据,各线程间的数据又是独立的)。二、使用举例  线程范围内的共享变量,每个线程有自己独立的数据。例如每个线程要有自己独立的连接。ThreadLocal本质上是一个map。  只要定义一个ThreadLocal变量,往...

2018-08-19 17:42:00 131

转载 线程应用:(九)阻塞队列的应用

队列:先进先出1)ArrayBlockingQueue,固定大小队列  当固定大小的队列满了时,可以选择以抛异常(Throws exception)、立马返回判断值(Special value)、阻塞(Blocks)中的1种形式进行操作。如下图。  案例1:有2个线程从队列取数据,有1个线程往队列放数据。import java.util.concurrent.Ar...

2018-08-13 20:53:00 107

转载 线程应用:(八)Semaphere信号灯、CyclicBarrier汇合、CountDownLatch计数器、Exchanger...

一、Semaphere信号灯  Semaphere与互斥锁的区别:有多个线程时,只有获得互斥锁的那个才能进入,而信号灯是可以同时多个线程一起运行的,信号灯为1时相当于互斥锁。  等待的线程准备获得信号灯的顺序是随机的,但可以设置先到先得。  假设有10个线程,但只有3个信号灯,能实现并发访问的线程数只能为3,剩下的7个线程要等待获得信号灯才能运行,代码如下。import ...

2018-08-13 20:52:00 185

转载 线程应用:(七)Lock & Condition同步通信

一、线程锁:Lock 代替synchronized  Lock的作用类似于传统线程模型中的synchronized,更体现面向对象的思想,两个线程执行的代码片段要实现同步互斥的效果,必须要用同一个Lock对象。1)ReentrantLock//用Lock替换synchronized互斥import java.util.concurrent.locks.Lock;i...

2018-08-13 20:51:00 133

转载 线程应用:(六)线程池、Callable与Future

一、线程池  TCP服务器编程模型中,每来一个客户端连接时,服务端就要创建一个新线程为之服务,当与客户端的会话结束时,线程也就结束了。  在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池在拿到任务后,它就在内部找有无空闲线程,再把任务交给内部某个空闲的线程,一个线程同时只能执行一个任务,但可以向线程池提交多个任务。  池子里只有3个线程,但有10个...

2018-08-13 20:50:00 105

转载 线程应用:(五)传统线程使用实例

一、创建线程的两种方式(1)子类继承Thread,并重写run方法public static void main(String[] args) { SubThread s1 = new SubThread(); SubThread s2 = new SubThread(); s1.start(); s2.start();}c...

2018-08-13 20:47:00 99

转载 线程理论:(四)锁优化

优化一:自旋锁与自适应自旋  互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力。共享数据的锁定状态只会持续很短的一段时间,让后面请求锁的那个线程“稍等一下”,但不放弃处理器的执行时间,看看持有锁的线程是否很快就会释放锁。为了让线程等待,我们只需让线程执行一个忙循环(自旋),这项技术就是所谓的自旋锁。  ...

2018-08-13 20:46:00 98

转载 线程理论:(三)线程安全的实现方法

定义:当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调用和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。一、五类共享数据1、不可变  不可变的对象一定是线程安全的,不需要再采取任何的线程安全保障措施。“不可变”带来的安全性是最简单和最纯粹的。  Java语言中,如果共...

2018-08-13 20:42:00 172

转载 线程理论:(二)Java与线程

一、线程的实现  线程是比进程更轻量级的调度执行单位,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度(线程是CPU调度的基本单位)。  线程的实现主要有如下3种方式:1)使用内核线程实现  内核线程(KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。  ...

2018-08-13 20:39:00 115

转载 线程理论:(一)Java内存模型、volatile

一、Java内存模型(JMM)  Java内存模型是为了定义虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量是指实例字段、静态字段和构成数组对象的元素,不包括局部变量与方法参数,因为后者是线程私有的,不会被共享,自然不会存在竞争问题。  Java内存模型规定了所有的变量都存储在主内存中,每条线程都有自己的工作内存,工作内存保存了被该线程使用到的变量的主内存副本...

2018-08-13 20:37:00 82

转载 JVM理论:(四/2)编译过程——晚期(运行期)

一、解释器与编译器  当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码” 。为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器(JIT 编译器)。  即时编译器并不是虚拟机必需的部分,但是,即时编译器编译性能的好坏、代码优化程度的高低却是衡量一款商用虚拟机优秀...

2018-07-29 14:32:00 118

转载 JVM理论:(四/1)编译过程——早期(编译期)

  Java 语言的 “编译期”其实可以分为3类编译过程:  前端编译器:把*.java文件转变成*.class文件的过程。  后端运行期编译器(JIT编译器):把字节码转变成机器码的过程。  静态提前编译器(AOT编译器):直接把*.java文件编译成本地机器代码的过程。  Javac这类编译器对代码的运行效率几乎没有任何优化措施。虚拟机设计团队把对性能的优化集中到了后...

2018-07-29 14:31:00 95

转载 JVM理论:(三/8)关于String、StringBuffer、StringBuilder、final

  以下是从网上整理出的资料,不同作者对某些具体描述有略微差别,有的具体描述可能会存在不准确的情况,但结论是一致的。一、String  equals比较值,==比较引用,我们主要关注引用的比较。1、两种方式创建String的过程String s1="abc";String s2="abc";String s3 = new String("abc");Sys...

2018-07-29 14:30:00 150

转载 JVM理论:(三/7)关于类变量、成员变量、局部变量的案例总结

一、类变量、成员变量、局部变量的内存分布  结合前文,对类变量、成员变量、局部变量三种变量的内存分布进行总结1)类变量:方法区。静态变量随类加载到方法区中。方法区中存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。线程共享。2)成员变量:堆。从父类继承下来或在子类中定义的各种类型的字段内容都存在对象的实例数据里,成员变量会在对象实例化时随着对象一起分...

2018-07-29 14:29:00 89

转载 JVM理论:(三/6)类加载器、双亲委派

一、类与类加载器  允许类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作可以让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。  类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立其在Java虚拟机中的唯一性,每一个类加载器,...

2018-07-29 14:28:00 76

转载 JVM理论:(三/5)类加载机制

  前文已经讲了Class文件的存储格式、方法的调用过程、字节码的执行过程。但是虚拟机是如何加载这些Class文件的呢?Class文件中的信息进入到虚拟机后会发生什么变化?  虚拟机将描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。在Java语言中,类型的加载,连接和初始化过程都是在程序...

2018-07-29 14:27:00 86

转载 JVM理论:(三/4)方法调用

  本文主要总结虚拟机调用方法的过程是怎样的,JAVA虚拟机里面提供了5条方法调用的字节码指令。分别如下:  invokestatic:调用静态方法  invokespecial:调用实例构造器<init>方法、私有方法和父类方法。  invokevirtual:调用所有的虚方法。  invokeinterface:调用接口方法,会在运行时期再确定一个实现此接...

2018-07-29 14:25:00 110

转载 JVM理论:(三/3)运行时栈帧结构、基于栈的字节码解释执行过程

一、栈帧结构  讲栈帧结构有必要回顾一下前文Class文件中的Code属性结构,如下图。    栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,它是虚拟机栈的栈元素。每一个方法从调用开始到执行完成,都对应着一个栈帧在虚拟机栈里面从入栈到出栈的过程。每一个栈帧都包括了局部变量表,操作数栈,动态连接,方法返回地址和一些额外的附加信息。  在编译阶段,栈帧中需要多大的局部...

2018-07-29 14:23:00 414

转载 JVM理论:(三/2)字节码指令

  回顾一下前文,知道了属性表的Code属性存着Java程序方法体的代码经过Javac编译器处理后,最终变为字节码指令。还知道了Code属性表中的code是一个u1类型的单字节,取值范围是0x00~0xFF,也就是一共最多能表达256条指令。  由于Java虚拟机采用面向操作数栈而并非寄存器的架构,所以大多数的指令都不包含操作数(跟随操作码后所需的参数),只有一个操作码(代表指令的代...

2018-07-29 14:22:00 95

转载 JVM理论:(三/1)class类文件结构

  各种不同平台的虚拟机,与所有平台都统一使用的程序存储格式——字节码,是构成平台无关性与语言无关性的基石。  Java虚拟机不和包括Java在内的任何语言绑定,它只与“Class文件”这种特定的二进制文件格式所关联。Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在Class文件之中,中间没有添加任何分隔符。    Class文件里的数...

2018-07-29 14:21:00 108

转载 JVM理论:(三)类加载机制

一、类文件结构  1、class类文件结构    1)魔数与Class文件的版本    2)常量池    3)类或接口层次的访问标志    4)类索引、父类索引、接口索引集合,通过这三项数据来确定这个类的继承关系    5)字段表,包括类级变量、实例级变量,是不包括方法内部声明的局部变量的,不会列出从父类或父接口中继承的字段    6)方法表,方法体的代码经过...

2018-07-29 14:20:00 63

转载 JVM理论:(二/4)理解GC日志、垃圾收集器参数总结

JVM的GC日志的主要参数包括如下几个:-XX:+PrintGC 输出GC日志-XX:+PrintGCDetails 输出GC的详细日志-XX:+PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX:+PrintGCDateStamps 输出GC的时间戳(以日期的形式,如 2013-05-04T21:53:59.234+0800)-XX:+PrintH...

2018-07-29 14:14:00 130

转载 JVM理论:(二/3)垃圾收集算法、垃圾收集器

  掌握三种垃圾算法,七种垃圾收集器,了解每种垃圾收集器使用的是哪种垃圾收集算法,以及关于SafePoint的知识点。垃圾收集算法1、标记-清除算法(Mark-Sweep)  先标记(如可达性算法)出所有需要回收的对象,标记完后再统一回收所有被标记的对象。  缺点:标记和清除过程的效率都不高,且清除后会产生大量不连续的内存碎片。2、复制算法(Copying)...

2018-07-29 14:13:00 135

转载 JVM理论:(二/2)判断对象是否已死

讲到垃圾回收,首先就要先知道哪些对象是可以回收的。可达性算法  这里有必要先了解一下可达性算法,以“GC Roots”的对象作为起始点,若从“GC Roots”到某对象不可达时,此对象会被判定为可回收对象。  可作为GC Roots的对象包括下面几种:  1、虚拟机栈(栈帧中的本地变量表)中引用的对象。  2、方法区中类静态属性引用的对象。  3、方法区中常量引用...

2018-07-29 14:12:00 101

转载 JVM理论:(二/1)内存分配策略

  Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存。对象的分配可能有以下几种方式:1、JIT编译后被拆散为标量类型并间接地栈上分配2、对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配3、少数情况下也会直接分配在老年代参考下图:  5种内存分配策略...

2018-07-29 14:11:00 79

转载 JVM理论:(二)垃圾收集器与内存分配策略

  Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决两个问题:给对象分配内存以及回收分配给对象的内存。一、内存分配策略  要了解堆空间内又分有哪几个内存区域(年轻代:eden、s1、s2,老年代),创建对象时按什么规则分配到堆。  1)对象优先在Eden分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。  2)大对象直接进入老年代...

2018-07-29 14:10:00 83

转载 JVM理论:(一/2)OutOfMemoryError异常

  在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM )异常的可能。1、Java堆溢出  Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。  限制Java堆的大...

2018-07-29 14:09:00 76

转载 JVM理论:(一/1)对象的创建过程

一、对象的创建1、当虚拟机遇到一条new指令时,会先检查常量池中能否定位到这个类的符号引用,然后检查这个符号引用代表的类是否被加载、解析、初始化过。2、如果类还未加载过,要先执行类加载过程,静态变量此时会有一个系统初始值。3、类加载检查通过后,为新生对象在堆中分配内存,对象所需内存大小在类加载完后可完全确定。为对象分配内存有两种方法:  指针碰撞——如果java堆...

2018-07-29 14:07:00 56

转载 JVM理论:(一)JVM内存模型

一、JVM内存模型      1、程序计数器  线程私有,当前线程所执行的字节码的行号指示器,通过计数器来选取下条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都依赖此功能,唯一没有规定OutOfMemoryError的区域,若执行的是Native方法,计数器值为空。2、Java虚拟机栈 (1)线程私有,生命周期和线程相同。 (2)栈与栈帧定...

2018-07-29 14:05:00 69

转载 MySQL优化(6):Mysql锁机制

对数据操作的类型:读锁(共享锁)—— 同一数据,多个读操作可以同时进行写锁(排他锁)—— 写操作未完成前,会阻断其他读锁和写锁对数据操作的粒度:表锁(偏读)—— 偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。行锁(偏写)—— 偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发生锁冲突的概率最低,并发度...

2018-06-10 20:54:00 58

转载 MySQL优化(5):索引失效分析、in与exists使用场合

一、索引失效的情况  前文提及过可以通过explain的possible_keys、key属性判断索引是否失效,key如果为null,可能是索引没建,也可能是索引失效,下面列举一些会使索引失效的情况。1、全值匹配:顺序、个数与索引一致2、最佳左前缀法则:查询从索引的最左前列开始并且不跳过索引中的列,中间跳过的值,后面的索引会失效3、索引列上做了操作(计算、函数、自动或手动...

2018-06-10 18:32:00 466

转载 MySQL优化(4):explain分析

Explain是Mysql的自带查询优化器,负责select语句的优化器模块,可以模拟优化器执行SQL查询语句,从而知道Mysql是如何处理SQL的,语法也很简单:Explain + SQL以下是通过explain查询出的几个属性  (常见性能瓶颈 —— CPU:CPU饱和一般发生在数据装入内存或从磁盘上读取数据时 IO:磁盘I/O瓶颈发生在装入数据远大于内存容量时...

2018-06-09 19:24:00 69

转载 MySQL优化(3):慢SQL分析

对慢SQL优化一般可以按下面几步的思路:1、开启慢查询日志,设置超过几秒为慢SQL,抓取慢SQL2、通过explain对慢SQL分析(重点)3、show profile查询SQL在Mysql服务器里的执行细节和生命周期情况(重点)4、对数据库服务器的参数调优一、慢查询日志1、设置慢查询(1)设置开启:SET GLOBAL slow_query_log = ...

2018-06-09 19:07:00 99

转载 MySQL优化(2):索引简述

一、基本语法  创建索引前会先排序,会影响where和order by的效率。  索引也是一张表,保存了主键和索引字段和指向实体表的记录,也是要占空间的,以索引文件的形式存储在磁盘。  增删改数据时,索引指向也要改变,所以会慢,需要频繁删改的字段不适合建索引。  索引的建立也需要不断的优化、调整。 1、创建,两种写法  CREATE [UNIQUE] INDE...

2018-06-05 21:55:00 60

转载 MySQL优化(1):Mysql简述

一、逻辑架构  MySQL也采用分层架构。插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存取相分离,这样就可以根据业务需求来选择适合的存储引擎。  1、层次结构   连接层——业务逻辑处理层(处理sql)——数据存储引擎——硬盘  (1)连接层   是一些客户端和连接服务,主要完成类似于连接处理、授权认证、及相关的安全方案。该层引入了连接池的概念,...

2018-06-01 19:35:00 69

转载 MySQL基础(4):事务控制

查看存储引擎:show engines;InnoDB支持事务,MyISAM、MEMORY不支持事务1、事务的特性:(ACID)  原子性:一个事务不可再分割,要么都执行要么都不执行。  一致性:一个事务执行会使数据从一个一致状态切换到另一个一致状态  隔离性:一个事务的执行不受其他事务的干扰(需要通过设置隔离级别)  持久性:一个事务一但提交,则会永远改变数据库数...

2018-05-31 08:10:00 63

转载 MySQL基础(3):进阶用法

一、视图正式环境中有时需要只提供原始表的部分信息以保护数据安全性,就可以用视图,相当于虚拟表#1、创建: CREATE VIEW 视图名(列1,列2...) AS SELECT (列1,列2...) FROM ...;#2、使用:把视图当虚拟表用#3、修改: create or replace view 视图名 as 查询语句; alte...

2018-05-30 21:56:00 71

转载 MySQL基础(2):DDL语言

一、DDL语言1、库操作(1)删除:drop database if exists 旧库名;(2)创建:create database 【if not exists】新库名;(3)修改:alter database 库名 character set gbk; #修改字符集2、表操作(1)删除:drop table if exists 旧表名;(2...

2018-05-30 20:09:00 70

转载 MySQL基础(1):基本语法

记录一些可能会用到但又容易忘记的语法。一、数据增删改1、新增  (1)单条数据:INSERT INTO 表名 (列1,列2,...) VALUES (值1,值2,....);  (2)批量插入:INSERT INTO 表名 (列1,列2,...) VALUES (值1,值2,....),(值1,值2,....),(值1,值2,....);  (3)插入子查询:IN...

2018-05-30 19:59:00 73

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除