自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 多线程下的单例模式

相信大家都对单例模式非常熟悉了,可以利用单例模式重复使用某个对象。有一次面试的时候,问到了单例模式,终于明白自己对线程模式下的单例模式不是很了解。饿汉式单例模式是线程安全的,但是它在加载类时就创建实例,不管实例用不用地到,考虑到效率问题,所以个人更喜欢懒汉式单例模式(延迟加载),于是面试题就根据懒汉式单例模式展开。首先,我们来写一个单线程下的懒汉式单例模式public class Sing

2015-04-01 20:52:11 654

原创 动态代理

代理设计模式用法广泛,平时接触的最多的就是Spring的AOP了,实际就是动态代理的实现。那怎么做呢?一、定义接口public interface Subject { public void doSomething();}二、定义实际对象,即被代理对象public class RealSubject implements Subject { @Override public

2015-03-31 22:13:44 504

原创 Java并发学习笔记(九)-原子类AtomicInteger

AtomicInteger能够保证对一个整型的操作是原子性。像i++这个操作不是原子操作,存在竞态条件,所以需要加锁,但是加锁的性能不高,如果仅仅为了对一个整数加1。我们来看下他的实现。 private volatile int value;AtomicInteger本身持有一个整型变量,所有的操作都是基于这个变量的。变量由violate修饰,这个变量是保证可见性的,具体可见另一

2015-03-27 19:28:04 977

原创 Java并发学习笔记(八)-LinkedBlockingQueue

LinkedBlockingQueue是由链表组成的阻塞队列,先来看demo public class LinkedBlockingQueueDemo { public static void main(String[] args) { ExecutorService es = Executors.newCachedThreadPool(); BlockingQueue&lt...

2015-03-27 17:27:46 709

转载 Spring 事务机制详解

Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考。Spring声明式事务让我们从复杂的事务处理中得到解脱。使得我们再也无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码。我们在使用Spring声明式事务时,有一个非常重要的概

2015-03-23 23:11:31 429

转载 MySQL事务隔离级别详解

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。Read Uncommitted(读取未提交内容)       在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirt

2015-03-23 22:17:05 385

转载 Spring scope 学习笔记

摘自《Spring 解密》scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。打个比方吧!我们都是处在社会(容器)中,如果把中学教师作为一个类定义,那么当容器初始化这些类之后,中学教师只能局限在中学这个场景中,中学,就可以看做中学教师的

2015-03-23 17:41:55 390

原创 Integer的MIN_VALUE

遇到一个理所当然但是又没注意到的问题。在JDK中,整形类型是有范围的,最大值为Integer.MAX_VALUE,即2147483647,最小值为Integer.MIN_VALUE -2147483648。对整形最大值加1,2147483648(越界了),那么此时值为多少呢?结果是-2147483648,即是Integer.MIN_VALUE。类似的,对Integer.MIN_VA

2015-03-06 20:54:04 24438 5

原创 Java并发学习笔记(七)-ArrayBlockingQueue

Java并发包concurrent里提供了3个阻塞队列,ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue。阻塞队列通常用于生产消费模式,满队列时生产者阻塞,空队列时消费者阻塞。(一) ArrayBlockingQueueArrayBlockingQueue是一个有界的阻塞队列,底层实现是一个数组。public cl

2015-02-20 16:03:57 1771 1

原创 Java并发学习笔记(六)-互斥性和内存可见性

我们都知道,进程是个自封闭的运行环境,它有自己完整的一套运行时资源,特别是有自己的内存地址空间。进程中的线程共享进程的资源,如内存地址空间,文件句柄等。但线程又有自己的计数器、栈、本地变量,现代操作系统大多以线程,而非进程,作为基本调度单元。在大多平台中,JVM以单进程方式执行,Java线程共享JVM进程的内存和文件句柄。在CPU环境下,多线程可以提高CPU的利用率。而在单CPU下,可以在发生I/

2015-02-16 15:13:43 1151

转载 java.lang.IllegalMonitorStateException

java.lang.IllegalMonitorStateException 违法的监控状态异常。当某个线程试图等待一个自己并不拥有的对象(O)的监控器或者通知其他线程等待该对象(O)的监控器时,抛出该异常。//计算线程public class Calculator extends Thread { int total; public void run() { synchroni

2015-02-16 07:49:05 1836

原创 Java并发学习笔记(五)-显示锁

究竟采用内置锁还是显示锁?性能上,java6以后,两者性能比较接近。不过程序运行平台差别大,生产环境可能在必要的时候进行尝试才能确定性能的优缺。显示锁的可轮询,可定时,可中断也是我们选择显示锁的原因。但是内置锁也有比较大的优势。开发人员熟悉内置锁,内置锁简洁紧凑,程序中已经大量使用内置锁,最主要的是,显示锁的危险性比较高,开发人员绝对不能忘记在finally中调用unlock。所以一般还是使用内置锁,只有在内置锁无法满足需求,或者调优的情况下才使用显示锁。

2015-02-15 09:19:39 802

原创 访问私有变量,私有方法

我们都知道Java的访问权限分为public,包,protected,privated。没有相应的访问权限是无法访问类,对象,变量,方法等。我们都知道单例模式,是把构造方法私有化,其它类就无法创建该类的新对象,只能获得已经产生的对象。但是通过反射,我们可以访问到原来无法访问的变量,方法等。package com.test.reflection;public class Customer {

2015-02-04 17:03:49 2521

原创 Java并发学习笔记(四)-栅栏CyclicBarrier

闭锁是一次性对象,一旦进入终止状态,就不能被重置,它是用来启动一组相关的操作,或者等待一组相关的操作结束。栅栏跟闭锁有点类似,它能阻塞一组线程直到某个时间发生,但是这里有个很大的区别,在栅栏里,只有这组线程都到达栅栏位置时,才能继续执行栅栏和闭锁有以下区别栅栏可重复使用,在计数器为0的时候,会重置为原来的计数栅栏有栅栏动作,在计数器为0的时候,会执行栅栏动作那么栅栏的实现机制跟闭锁有什么区别?跟闭锁依靠Sync不同,栅栏是依靠可重入锁实现的。

2015-02-03 21:54:02 5053

原创 Java学习笔记-JVM内存管理

一、Java内存区域Java虚拟机把运行时数据区划分为几个不同的区域。线程私有的,即每一条线程都会有自己独立的内存空间,有以下几个部分:程序计数器虚拟机栈本地方法栈所有线程共享的内存空间,包括:堆方法区1、线程私有数据区程序计数器程序计数器比较小,保存当前线程所执行字节码的行号,字节码解释器工作时就是根据计数器的值来执行的。每一条线程都有自己

2015-01-29 19:10:43 526

原创 Java学习笔记-泛型及类型擦除

Java泛型代码在反编译后已经没有泛型,被替换为原来的类型,并且在相应读取数据的地方,插入了强制转换代码。所以运行时,ArrayList<Integer>与ArrayList<String>就是相同的类型。泛型在java中,实际上是一颗语法糖,实现方式为类型擦除,是一种伪泛型。

2015-01-28 21:17:24 478 1

原创 MappedByteBuffer的映射内存的释放

MappedByteBuffer的内存释放,主要由垃圾回收引起的。首先,来看一下Oracle的bug list,这是一个无法修复的bug,所以在使用MappedByteBuffer的时候一定要注意内存的释放。第一个case是:import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoun

2015-01-20 16:17:14 8291 3

原创 Java并发学习笔记(三)-闭锁CountDownLatch

闭锁CountDownLatch是一种同步类,它的作用相当于一扇门,在闭锁达到结束状态之前,这扇门一直是关闭的,没有线程可以通过,当达到结束状态的时候,这扇门就会打开,并且会永远保持打开状态,允许所有的线程通过。闭锁包含一个计数器,计数器就是这扇门,当计数器不为0的时候,调用latch.await方法的线程就会一直阻塞,直到计数器为0。即调用await方法的线程等待计数器为0。public

2015-01-14 10:34:58 613

原创 Java并发学习笔记(二)-Executor捕获异常机制

学习《java编程思想》的Executor捕获异常的时候,发现代码输出跟书上有出入,于是就研究了一下Executor的机制。

2015-01-04 22:20:29 3063

原创 Java并发学习笔记(一)-Runnable和Executor

并发通常是为了提高运行在单处理器上的程序的性能。在单处理器上,表面上看,并发程序往往由于增加了上下文切换导致程序CPU开销大,程序以单线程顺序执行开销会小一点,节省上下文切换的代价。那么为什么要在单处理器上使用并发呢?有以下两个原因:阻塞。程序的某个任务由于某些条件(一般是I/O),导致不能继续执行,那么这个任务或者线程阻塞了。单线程情况下,整个程序都将停下来,直到条件成熟。如果使

2014-12-20 12:04:40 3083 1

空空如也

空空如也

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

TA关注的人

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