自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

x

越努力,越幸运

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

原创 Java并发编程(五)-- ReentrantLock

锁是用来控制多个线程访问共享资源的方式,对共享资源加锁能够有效解决对资源的并发问题,比如在方法中或方法块中加synchronized关键字。在JDK5以后并发包中增加了Lock接口,用来实现锁功能。Lock提供了与Synchronized类似的同步功能,但是在使用时需要显示的获取和释放锁,故而Lock又称为“显示锁”,Synchronized则称“隐式锁”。Lock相对于Synchronized,...

2018-05-25 23:23:15 367

原创 JVM进阶之GC(五)对象的内存分配和回收策略

简单回顾下JVM内存结构和垃圾回收器。JVM内存结构JVM内存主要由新生代、老年代、永久代构成。新生代(Young Generation):大多数对象在新生代中被创建,其中很多对象的生命周期很短。每次新生代的垃圾回收(又称Minor GC)后只有少量对象存活,所以选用复制算法,只需要少量的复制成本就可以完成回收。新生代内又分三个区:一个Eden区,两个Survivor区(一般而...

2018-05-21 17:02:42 2164 1

原创 Java并发编程(四)-- AQS

锁是用来控制多个线程访问共享资源的方式,对共享资源加锁能够有效解决对资源的并发问题,比如在方法中或方法块中加synchronized关键字。在JDK5以后并发包中增加了Lock接口,用来实现锁功能。Lock提供了与Synchronized类似的同步功能,但是在使用时需要显示的获取和释放锁,故而Lock又称为“显示锁”,Synchronized则称“隐式锁”。Lock相对于Synchronized,...

2018-05-01 17:45:16 629

原创 Java并发编程(三)-- 线程池及其常用实现

Java里的线程池在平日的工作用的不算少,特别是有大量数据需要多线程处理的情形,那么大家在用之前是不是该刨根问底呢? 我们知道,线程池不光是Java里有涉及,各大开源框架、中间件、数据库等都会设计不同类型的线程池,比如Dubbo、Tomcat、MySQL等等等,因为使用线程池的好处如下:通过重复利用已经创建的线程降低线程创建和销毁带来的性能损耗;提高任务的响应速度,任务不需要等待线程创建...

2018-04-06 19:57:44 750

原创 Java并发编程(二)-- synchronized

从上一篇讲线程中,我们了解到了线程的各个状态,以及如何状态间的转换。此篇来温习下,线程的阻塞状态与运行态是怎样的转换过程。synchronized我们知道,多个线程相互配合的完成某一项工作,必然牵扯到对共享资源的竞争。而synchronized关键字便是有效实现多个线程间同步操作的利器,可以使共享资源在同一时间只能被一个线程享用,从而保证了线程对共享资源的可见性和排他性,实现线程安全。...

2018-03-30 22:51:28 304

原创 Java并发编程(一)-- 线程

线程是现代操作系统调度的最小执行单元,也有轻量级进程一说。一个进程可包含多个线程,或者说一个进程里可创建多个线程,每个线程都有自己独立的计数器、栈等等信息,并且能够访问共享的堆内存中变量数据。线程的状态Java的线程是有生命周期的,在运行过程中处于以下6种状态之一:状态名称 说明NEW 初始状态,线程被构建,但是还没有调用start0方法RUNNABLE 运行状态,...

2018-03-28 22:47:04 270

原创 笔试题(1)--两个线程交叉打印递增数字,用synchronized和wait实现

朋友在最近的笔试中遇到一道笔,如下: 开启两个线程,一个线程打印1到100的奇数。如1,3,7…99. 另外一个线程打印1到100的偶数。如2,4,6…100. 1到100的数字最终打印出来格式是1,2,3,4,5…100. 要求用synchronized和wait实现.Talk is cheap,show me the code:public class WaitT...

2018-03-23 23:14:37 3279

原创 JVM进阶之GC(四)垃圾收集器

上一篇讲了下垃圾回收算法,今天就来说说垃圾回收算法的具体实现吧–垃圾收集器(本文讨论的是JDK1.7版本的HotSpot虚拟机)。垃圾收集器HotSpot虚拟机提供的收集器如下图: 新生代的垃圾收集器有:Serial、ParNew、Parallel Scavenge; 老年代的垃圾收集器有:CMS、Serial Old、Parallel Old G1收集器因运用的还不是很广泛...

2018-02-05 22:57:35 381

原创 JVM进阶之GC(三)垃圾回收算法

上篇我们讨论了怎么判断对象是否存活,判了“死刑”的对象就会在垃圾回收中被回收掉。那么本文将说说JVM是如何回收垃圾的。垃圾回收算法标记-清除算法算法的过程就如同算法的名字,分为标记和清除两个阶段:首先标记出所有要回收的对象,然后对标记的对象统一清除。算法很简单,再看下逻辑图: 内存空间经过标记清除算法回收的过程一目了然,从图中也能看出这种算法的不足,即标记清除后会产生大量

2018-01-24 23:16:28 396

原创 JVM进阶之GC(二)对象存活判断算法

上一篇简单的说明了对象在JVM中的内存分代策略,此文继续来为GC打基础,说说什么样的对象需要被GC,即对象是否存活判定算法。判定对象存活算法如何判断对象沦为了垃圾也是门技术。引用计数法引用计数法就是给对象加个引用计数器,每有一个地方引用到它时,这个引用计数器就加1。当引用失效的时候,计数器的值就减1,也就是说根据引用计数器的值来判断对象是否存活,若值是0,那么该对象就不再被

2018-01-22 22:20:35 882

原创 JVM进阶之GC(一)内存分代

前言我们知道,java语言与c++语言最大的不同点就是在垃圾回收的处理上,java有了专门的垃圾自动回收机制,而c++需要手动回收内存垃圾。既然java的垃圾回收这么NB,那今天就来整理JVM的垃圾回收这块内容吧。首先得明确几点目的: 1. 为什么需要了解JVM的垃圾回收,让JVM自己去处理不就好了? 2. 是回收什么东西? 3. 是什么时候回收的? 4. JVM是怎么进行垃圾回收

2018-01-21 22:43:09 521

原创 JVM进阶之运行时数据区

前言  最近在看重温JVM相关的知识点,但总感觉看书很枯燥乏味,看别人的博客知识又显得零碎,知识体系不够系统,所以有必要把所见所闻所学的点,好好地梳理成文,加强自己理解程度的同时,挖掘自身的盲点。好了,鸡血不宜多,让我们开始JVM的新篇章。  话说平时开发中的我们有曾想过写过的代码运行在哪儿,比如在类中声明了static类型的变量,在方法中new了一个对象等等……如果这些都不了解,我只能说

2018-01-19 23:08:49 288

原创 源码浅析--String

源码浅析先拿String开刀。试问自己,平常工作中用的那么多,但是真的了解String吗? 想要真正了解一个类,还得从源码入手。(本文JDK源码版本1.7.0_75)public final class String implements java.io.Serializable, ComparableString>, CharSequenceString 实现了Ser

2018-01-16 23:25:55 183

原创 必知必会的单例模式

在开发过程中,有些对象我们至始至终只需要一个实例,比如配置文件、工具类、线程池、缓存、日志对象等,如果创造多个实例,就会导致许多问题,比如占用过多资源,不一致的结果等。基于以上的问题,单例模式应运而生了,下面来看看单例的实现方式吧。v1.0(非线程安全懒汉版)package com.v1;public class Singleton { // 私有构造方法 p

2018-01-11 23:05:27 207 3

原创 如何控制线程执行的顺序?

如何控制线程执行的顺序?要解决如上的题目,得理解题意的重心在哪。关键词:线程与顺序。先来一段多线程执行的代码。public class Test { public static void main(String[] args) { Thread t1 = new Thread(new MyThread1()); Thread t2 = new

2018-01-11 22:56:43 17047 3

原创 netty之基础概念

1、缓冲区BufferBuffer是一个存储读入或写出的对象。在面向流的IO中,可以将数据写入Stream或读取Stream对象的数据。而NIO是面向Buffer,面向缓冲区的,数据的写入或读取操作都是在缓冲区中进行的。Buffer的实质就是一个数组,但是比数组功能更强大,通常是一个ByteBuffer,也可以使用其他类型的数组。每一种基本类型都有对应的一种缓冲区(除了Boolean),比如Char

2017-07-26 19:47:39 353

原创 有一个任务队列,分别有A、B、C三种类型的任务,设计一种功能,让三种任务分别按照x:y:z(具体比例可配置)的比例进行执行

朋友的面试题,如下 有一个任务队列,分别有A、B、C三种类型的任务,设计一种功能,让三种任务分别按照x:y:z(具体比例可配置)的比例进行执行解之。 主要的思路是lock+condition处理任务调度。

2017-07-26 19:13:05 1238

原创 原型模式

什么是原型模式? 百科定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。通俗的说,就是复制现在的已有对象,来创建新的对象,java对象里的复制粘贴。实现方式Object类中提供有本地方法clone,java类只要实现了Cloneable接口,就可以使用clone方法来进行对象的拷贝,使用很简单,下面来看代码:public class Prototype implements

2017-07-02 11:06:49 254

原创 代理模式

今天聊聊平时工作中很常见的Java设计模式–代理模式。什么是代理模式?为其他对象提供一种代表,以控制对这个对象的访问。代理对象起到中介的作用,用户与代理对象打交道,不直接接触实际对象。使用代理模式创建代表对象,让代理对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或者需要安全控制的对象。常见的代理模式:远程代理–为不同地理的对象,提供局域网对象(监控全国分店)虚拟代理

2017-05-14 23:09:09 368

原创 JVM探秘之GC

GC的三个问题(what,when,how),带着问题去思考。哪些内存需要回收?  程序计数器、虚拟机栈、本地方法栈3个区域随线程而生死,所需要的内存大小基本是在编译期间确定下来的,一旦线程或方法结束,内存也就跟着回收了,所以这几个区域不需要过多的考虑垃圾回收问题。但是java堆和方法区只有在程序运行时才能确切的知道需要哪些对象需要多少内存,这部分的内存分配和回收都是动态的,所以这部分内存才是需要垃

2017-04-19 18:20:13 381

原创 JVM探秘之运行时数据区

(图来自《深入理解java虚拟机》)1、程序计数器(Program Counter Register)可以比作当前线程所执行的字节码的行号指示器。每条线程都需要有一个独立的程序计数器,线程私有的内存。计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值就是空的。2、Java虚拟机栈(Java Virtual Machine Stacks)线程私有,

2017-04-19 17:57:00 235

原创 浅谈ThreadLocal

今天将探讨下JDK源码中出现频次很高的关键字–ThreadLocal,线程本地变量。基本概念ThreadLocal类,究竟是干啥的,首先来看java官方文档的说明: 该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中

2017-04-13 16:05:03 225

转载 浅谈java并发容器ConcurrentHashMap

我们知道concurrentHashMap是线程安全而且高效的HashMap,至于为什么,我们今天来一探究竟。HashMap与HashTable  在多线程的环境下使用HashMap进行put操作会使HashMap的Entry链表出现环形链表,从而在get操作时出现死循环,导致CPU利用率接近100%,看看这篇文章《疫苗:JAVA HASHMAP的死循环》,具体就不赘述了。HashTable虽然是线

2017-04-11 17:29:05 310

转载 如何合理设置线程池大小

接着上一篇探讨线程池留下的尾巴,如何合理的设置线程池大小。 要想合理的配置线程池的大小,首先得分析任务的特性,可以从以下几个角度分析:任务的性质:CPU密集型任务、IO密集型任务、混合型任务。任务的优先级:高、中、低。任务的执行时间:长、中、短。任务的依赖性:是否依赖其他系统资源,如数据库连接等。性质不同的任务可以交给不同规模的线程池执行。对于不同性质的任务来说,CPU密集型任务应配置尽

2017-04-05 16:49:12 45171 7

原创 浅谈Java线程池

Java中的线程池是日常工作中用的比较频繁的并发框架了,几乎所有需要并发执行的程序都可以使用线程池。那么,使用线程池的程序究竟有什么好处呢?答案无非就是以下两点。降低资源消耗。   通过重复利用已创建的线程,降低了频繁切换线程上下文(创建与销毁)所带来的资源消耗。提高了线程的可管理性。    线程是稀缺资源,如果无限制的创建,过多的消耗系统资源,可能会导致服务器崩溃。使用线程池可以进行统一的

2017-04-04 15:42:36 402

转载 浅谈CAS

CAS(Compare and Swap),比较并交换。 java语言中,多线程访问一个互斥的变量时,主要是通过synchronized或者lock锁来达到线程间同步的目的。虽然锁机制在使用合理的情况下可以保证线程安全,但是使用锁带来的性能问题是一个痛点。java5更新后,开发非阻塞算法成为可能,而CAS实现了区别于锁机制的对变量同步特性的一种技术。非阻塞算法 (nonblocking algor

2017-04-01 11:49:48 244

原创 bug焦虑症

“某某某,禅道有你的bug”,“喂,那谁,你做的功能点不了”,“某某某,你的bug补丁被打回了”……每当听到这些话时,我心里像坐着跳楼机一样悬着,又是哪里代码出错了么?反复拷问自己,同时回想bug出现的场景和相关代码……次奥,原来是这里疏忽了,长叹一口气。      我们每个人写程序都会出现或多或少的bug,这是无法避免的,因为不可能把写代码做到绝对完美。当然,每个程序猿都想避免bug产生,但是

2017-03-29 23:02:33 381

原创 浅谈volatile关键字

Java的volatile关键字在JDK源码中经常出现,但是对它的认识只是停留在共享变量上,今天来谈谈volatile关键字。volatile,从字面上说是易变的、不稳定的,事实上,也确实如此,这个关键字的作用就是告诉编译器,只要是被此关键字修饰的变量都是易变的、不稳定的。

2017-03-19 18:10:41 18594 9

原创 隐式锁 Synchronized 与显示锁 Lock的用法和简单对比

SynchronizedSynchronized是Java的关键字,当它用来修饰一个方法或一个代码块时,能够保证在同一时刻最多只有一个线程执行该代码。因为当调用Synchronized修饰的代码时,并不需要显示的加锁和解锁的过程,所以称之为隐式锁。Sychronized的用法:1、同步方法体,在方法声明中使用,如下:public synchronized void method(){

2017-03-12 19:56:58 5279 2

转载 Java线程面试题 Top 50

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发、调试、优化经验,所以线程相关的问题在面试中经常会被提到。      在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线

2017-02-06 16:51:44 310

原创 JAVA多线程实现的三种方式

春节还未结束,业务请求还处于高峰期,于是暴露了请求过多、响应时间过长的问题。针对这种问题的优化,揪其原因,在于处理业务请求是单线程处理,请求过多时,响应慢。将业务处理代码改为多线程处理,即解决了问题。   今天浅谈下java多线程的几种实现方式。   JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future

2017-02-06 16:19:00 307

转载 Spring core组件

Core 就是发现、建立和维护每个 Bean 之间的关系所需要的一些列的工具,从这个角度看来,Core 这个组件叫 Util 更能理解。  Core 组件作为 Spring 的核心组件,他其中包含了很多的关键类,其中一个重要组成部分就是定义了资源的访问方式。这种把所有资源都抽象成一个接口的方式很值得在以后的设计中拿来学习。下面就重要看一下这个部分在 Spring 的作用。Resource 相关的类结

2017-01-24 15:39:58 857

转载 Spring Context组件

前面说 Bean 是 Spring 中关键因素,那 Context 和 Core 又有何作用呢?前面把 Bean 比作一场演出中的演员的话,那 Context 就是这场演出的舞台背景,而 Core 应该就是演出的道具了。只有他们在一起才能具备能演出一场好戏的最基本的条件。当然有最基本的条件还不能使这场演出脱颖而出,还要他表演的节目足够的精彩,这些节目就是 Spring 能提供的特色功能了。  Bea

2017-01-24 15:35:15 295

转载 Spring Bean 组件

了解Spring的都知道,Spring有三大核心组件:Core、Context 和 Beans,它们构建起了整个Spring的骨骼架构。没有它们就不可能有 AOP、Web 等上层的特性功能。如果再在它们三个中选出核心的话,那就非 Beans 组件莫属了,为何这样说,其实 Spring 就是面向 Bean 的编程(BOP,Bean Oriented Programming),Bean 在 Spring

2017-01-24 15:29:19 287

转载 Mysql Join语法解析与性能分析

一.Join语法概述join 用于多表中字段之间的联系,语法如下:... FROM table1 INNER|LEFT|RIGHT JOIN table2 ON conditionaltable1:左表;table2:右表。JOIN 按照功能大致分为如下三类:INNER JOIN(内连接,或等值连接):取得两个表中存在连接匹配关系的记录。LEFT JOIN(左连接):取得左表(table1)完

2017-01-23 11:50:31 350

原创 MyBatis 中#与$的区别

今天在工作中有个点击排序的功能调试了许久,终寻因,总结之。   需求是这样的,页面有个table,有一列的上下箭头可点击并排序。对于这种需求,我的mybatis.xml的sql配置写成了如下:<if test="map.ColumnNameSort!=null and map.ColumnNameSort!=''">   ORDER BY columnName #{map.ColumnNameS

2017-01-22 23:42:33 22529 2

转载 HBase的rowkey设计

访问hbase table中的行,只有三种方式:   1 通过单个row key访问   2 通过row key的range   3 全表扫描文中可能涉及到的API: Hadoop/HDFS:http://hadoop.apache.org/common/docs/current/api/ HBase: http://hbase.apache.org/apidocs/index.html?

2017-01-14 11:35:06 305

原创 HBase简介及数据模型

HBase简介  HBase是一个构建在HDFS上的分布式列存储系统;   HBase是基于Google BigTable模型开发的,典型的key/value系统;   HBase是Apache Hadoop生态系统中的重要一员,主要用于海量结构化数据存储;   从逻辑上讲,HBase将数据按照表、行和列进行存储;   与hadoop一样,Hbase目标主要依靠横向扩展,通过不断增加廉价的商

2017-01-14 10:48:21 859

原创 2016总结,2017展望

2016过去了,我很怀念,越发地感觉到“光阴似箭,日月如梭”时间匆匆流逝,而我在2016生活和工作中做了哪些有意义的事,做的什么不足或留有遗憾的事,今天记录下来,算是对2016的自己画上句号了。还有对2017的展望和目标,同样列出来,以示警醒未来的自己。      首先细数下2016年我的“成绩”,按时间顺序依次是:      1 拿到了驾照。   说起这个驾照也是一把辛酸一把泪,报名了近

2017-01-02 23:31:09 425

原创 java反射

什么是java反射?    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。(from:百度百科)  指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。

2017-01-02 16:37:12 193

空空如也

空空如也

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

TA关注的人

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