- 博客(96)
- 资源 (9)
- 收藏
- 关注
原创 JDK1.7之下的inern用法
JDK1.7之下的inern用法:String s = new String("1aaa"); s.intern(); String s2 = "1aaa"; System.out.println(s2 == s.intern()); true
2017-08-27 20:44:56
687
原创 垃圾收集器(二)
1、串行回收器串行回收器使用单线程进行垃圾回收的回收器。每次回收时,串行回收器只有一个工作线程,对于并行能力较弱的计算机来说,串行回收器的专注性和独占性往往有更好的性能表现。串行回收器可以在新生代和老年代使用。根据作用于不同的堆空间,分为新生代串行回收器和老年代串行回收器。 新生代串行收集器使用复制算法。
2017-08-27 18:25:00
400
原创 分代垃圾收集器
将堆划分成不同的代(Generation) 分为老年代(Old Generation 或者Tenured Generation)和新生代(Young Generation)。新生代又分为Eden空间(称之为 伊甸园 ,喻意为对象“出生”的地方)和Survivor空间,一般会有两个完全相同的Survivor空间,称之为from Survivor和to Survivor。
2017-08-21 23:31:08
737
原创 利用二进制解决一些问题
二、 简单题目总结:1 已知数n,检测其K位(二进制)是否置位(是否为1) n&(1<<k-1) 如果表达式为真,则第K位置位1。说明: 1 左移 k-1位,变为 第K位为1,其他的位置为0. 根据公式a和公式c, n的二进制除k位之外,均变成0,而第k位与1 &之后,原来是什么还是什么。
2017-08-20 20:13:26
1387
原创 二叉堆
堆是一颗具有特定性质的二叉树。堆的基本要求是堆中所有结点的值必须大于或者等于(或者小于等于)其孩子结点的值。这也是堆的性质,堆还有一个性质,就是当h>0时,所有叶子结点都处于第h层或者h-1层。(h为树的高度),堆应该是一颗完全二叉树。
2017-07-27 23:18:13
267
原创 模板方法模式
定义一个操作中的算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。其中一开始不能理解的“延迟”一词,如果延迟实现了,那在没有实现之前怎么使用呢?在实际中情况,我们一般是直接使用子类,而不是使用父类。因此父类一般定义为抽象类。模板方法用来解决那些有多个不同实现方式的算法。Java中用到模板方法模式的一个地方就是,并发包中锁(同步组件)的
2017-07-19 23:27:12
286
原创 Java 并发 CountLatchDown
一个同步工具,使得当前线程等待,直到其他多个线程完成一系列的操作后,继续执行。 其中的当前线程也可以是多个线程,这个地方的线程的数量是任意的。也就是await() 可以在多个线程中调用。 这个方法可以使得当前线程等待,也就是当前线程在未获得同步状态时,进入等待状态。因此这个这个也是获取同步状态的方法。这个方法获取同步状态,是以共享式的获取同步状态,因此await() 可以在多个线程中调用。
2017-07-19 22:45:45
1373
2
原创 Java 并发编程 锁与同步器
1、lockLock 接口是Java并发包中最基础的一个接口,相应的它定义了一些锁的基本功能。相比synchronized关键字,具有以下特征: 可以尝试非阻塞地获取锁 可中断的获取锁 定时获取锁
2017-07-17 21:40:07
645
原创 CountdownLatch 模拟 玩家就位
以下是代码 CountdownLatch是一个同步工具类,它可以使得等待几个线程一起执行完毕后,再开始执行后面的程序。
2017-07-12 23:04:07
247
原创 ConcurrentSkipListMap
在JDK的并发包中,除了常用的哈希表外,还有一种数据结构–跳表。跳表是一种可以用来快速查找的数据结构,有点类似与平衡树。它们都可以对元素进行快速查找。就查询性能而言,跳表的时间复杂度是O(log n)跳表的结构图如下:最底层呢的链表维护了跳表内的所有的元素,每上面一层链表都是下面一层的子集,一个元素插入哪些层是完全随机的。 跳表里面的数据是有序的。
2017-07-06 21:36:46
301
原创 Java 并发ThreadLocal
从ThreadLocal 的名字上可以看到,这是一个线程的局部变量。也就是说,只有当前线程可以访问。既然是只有当前线程可以访问的数据,自然是线程安全的。实际上,ThreadLocal确实也是Thread的一个属性:
2017-07-05 21:38:14
373
原创 java虚拟机对锁优化所做的努力
1、 锁偏向锁偏向是一种针对加锁操作的优化手段。如果一个线程获得了锁,那么锁就进入偏向模式。当这个线程再次请求锁时,无须再做任何同步操作。这样就节省了大量有关锁申请的操作,从而提高了程序性能。因此,对于几乎没有锁竞争的场合,偏向锁有比较红啊的优化效果,因为连续多次极有可能是同一个线程请求相同的锁。而对于锁竞争比较激烈的场合,其效果不佳。因为在竞争激烈的场合,最有可能的情况是每次都是不同的线程来请求相
2017-07-05 20:45:28
399
原创 锁优化的建议
1、减小锁持有时间它的核心思想就是不要在不必需要的代码上加锁,因为线程持有的锁时间过长,相对地,锁的竞争程度也就越激烈。看下面的代码:public synchronized void syncMethod() { othercode1(); mutextMethod(); othercode2(); } public void syncM
2017-07-05 19:57:20
306
原创 SynchronousQueue 实现 二
SynchronousQueue也是一种阻塞队列,同时也是同步队列。每一个put操作必须等待一个take操作;每一个take操作必须等待一个put操作。 没有任何内部容量。不允许是null元素。内部实现使用了Transferer。竞争机制支持公平和非公平两种: 非公平竞争模式使用的数据结构是后进先出的栈(TransferStack);公平竞争模式使用先进先出的队列(TransferQueue)。S
2017-07-04 22:39:21
266
原创 SynchronousQueue的实现 TransferQueue (一)
先看下 TransferQueue下面介绍它的几个方法: transfer(E e)若当前存在一个正在等待获取数据的消费者线程,该消费者线程,会立刻得到这个数据。否则,将e插入到队列的尾部,并且当前线程进入阻塞状态。即在没有消费者的情况下,生成者也无法进行生产。tryTransfer (E e)若当前存在一个正在等待获取的消费者线程,则该方法会即刻转移e,并返回true,若不存在则返回false。
2017-07-04 21:28:23
559
原创 Java 并发编程 CAS
1、比较交换 CAS与锁相比,使用比较交换会使程序看起来更加复杂一些。但由于其非阻塞性,他对死锁问题天生免疫,并且,线程间的相互影响也远远比基于锁的方式要小。使用无锁的方式完全没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销。
2017-07-03 21:53:19
320
原创 Java 并发编程 Fork Join 一
“分而治之”一直是一个非常有效地处理大量数据的方法。著名的MapReduce也是采取了分而治之的思想。 Fork就是分解任务,而Join 在Java线程中是等待意思 ,也就是等待计算结果。在实际应用中如果毫无顾忌地使用fork开启线程进行处理,那么很多可能会导致系统开启过多的线程而严重影响性能。
2017-07-02 19:15:24
251
原创 Java自定义拒绝策略与线程池
1、拒绝策略ThreadPoolExcetor 的最后一个参数指定了拒绝策略,JDK提供了四种拒绝策略: AbortPolicy 策略、CallerRunsPolicy策略、 DiscardOledestPolicy策略、DiscardPolicy策略。
2017-07-01 12:25:42
5184
原创 JDK中的线程池 :工作队列和拒绝策略 上
JDK 可以创建使用Executors 创建5种类型的线程池 Executors.newCachedThreadPool();该方法返回一个可根据实际情况调整线程数量的线程池。线程池的线程数量不确定,但若有空闲线程可以复用,则会优先 使用可复用的线程。 若所有线程均工作,又有新的任务提交,则会创建新的线程处理任务。所有线程在当前安任务执行完毕后,将返回线程池进行复用。
2017-06-29 22:45:56
2485
原创 spring IOC BeanFactory和ApplicationContext
1、设计介绍在Spring IOC 容器的设计中,有两个主要的容器系列,一个是实现Beanfactory接口的简单容器系列,这系列容器只实现了容器的最基本功能。另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。
2017-06-29 22:03:23
479
原创 Java并发编程 希尔排序
1、插入排序插入排序是一种很常用的排序算法。它的基本思想是:一个未排序的数据分成两部分,前半部是已经排序的,后半部分是未排序的。在进行排序时,只需要在未排序的部分中选择一个元素,将其插入到前面有序的数组中即可。最终未排序的部分会越来越少,直到为0,那么排序就完成了。平均时间复杂度 O(n2) 最好情况是 O(n) 最差时间是O(n2)
2017-06-26 23:15:48
662
原创 Java 并发编程 四 协作
ReadWriteLock读写锁概念很好理解,下面是代码:package com.test.thread3;import java.util.Random;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;import java.util.concurrent.locks
2017-06-25 17:14:09
323
原创 Java 并发编程 同步控制 三
1、 重入锁 ReentrantLock synchronized 的重入锁: ReentrantLock。 重入锁需要手动进行加锁和解锁: lock 和unlock。public class ReentrantLockTest implements Runnable{ public static ReentrantLock lock = new ReentrantLock();
2017-06-25 15:17:09
284
原创 Java 并发编程 基础 一
1、同步 和 异步同步 和 异步描述方法的调用。 同步:方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。 串行的进行方法的调用。 异步方法调用更像一个消息传递,一旦方法调用就会立即返回。2、并发和并行并发:多个任务交替执行。 并行:多个CPU的系统上,多个CPU同时执行任务。3、临界区:用来表示公共资源或者公共数据。可以被多个线程同时使用,但是每一次,只能有一个线程使用它。
2017-06-24 23:22:25
265
原创 Java并发 基础 二
1 、线程中断:线程中断是一种重要的线程协作机制。线程中断并不会让线程退出,只是给线程发送一个通知,线程执行过程会检测到这个通知,然后可以自定义做出动作,比如退出,但也并不是都是退出。
2017-06-24 23:16:24
260
原创 Session Cursor的种类和用法
Oracle数据库里的Session Cursor 又细分为三种类型,分别是 **隐式游标(Implicit Cursor)、 显示游标(explicit Cursor) 参考游标(ref cursor)**隐式游标:隐式游标是Oracle中最常见的游标,当我们执行sql 或者plsql时,Oracle都会自动帮我们创建隐式游标。之所以称为隐式游标,是因为它的生命周期: open pars
2017-06-13 23:03:58
1820
原创 Session Cursor 的相关参数
1 OPEN_CURSOR 可以使用sysdba帐号查看当前系统的OPEN_CURSORS的值: 单个Session中同时能够以OPEN状态并存的Session Cursor的总数。如果超过这个总是,Oracle会报错: ora-1000:maximum open cursors exceeded..可
2017-06-13 22:30:35
452
原创 Oracle Session Cursor
Session Cursor 是Oracle数据库里的第二种类型的Cursor,它当前Session解析和执行sql载体。Session Cursor缓存在PGA中,Shared 缓存在SGA中。Session Cursor和 Session是一一对应的,不同的Session的Session Cursor之间是没有办法共享的。
2017-06-13 22:24:42
874
原创 java 类加载器
虚拟机设计团队把类加载阶段中的“通过一个类的权限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块成为“类加载器”。
2017-06-13 22:16:41
237
原创 java 虚拟机 类加载
java 虚拟机 类加载类从被加载到虚拟机内存开始,到卸载出内存为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载。验证 、准备、解析 统称为连接。解析发生的阶段并不固定,它可能发生初始化之后。虚拟机规范确定了有且只有5种情况,必须进行初始化。1 遇到字节码指令new getstatic putstatic invokestatic时必须对进行初始化。这四种字节码指令产生的场
2017-06-11 23:19:53
248
原创 Oracle 硬解析和软件解析
硬解析:Oracle在执行目标sql时,在库缓存中找不到可以重用的解析树和执行计划,而不得不从开始解析目标sql并生成相应的Parent Cursor 和Child Cursor的过程。Oracle 在库缓存中找不到Parent Cursor和Child Cursor时都会执行硬解析过程。硬解析的危害性有如下几个方面:1、 硬解析可能会导致Shared Pool Latch的争用。在Shared P
2017-06-11 22:52:40
1323
原创 java 内存分配策略
1 对象优先在新生代Eden区中进行分配,当Eden区没有足够空间进行分配时,虚拟机进行一次Minor GC2 大对象直接进入老年代 所谓大对象就是需要大量连续内存空间的java对象,最典型的大对象就是很长的字符串以及数组。3 长期存活的对象进入老年代 虚拟机为每个对象定义了对象年龄的计数器,如果对象在Eden区出生,并经过第一次Minor GC后仍然存活,并且能够被Survivor
2017-06-11 22:27:43
392
原创 在java虚拟机中对象的创建过程
虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有,那么必须先执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从Java堆中划分出来。
2017-06-11 18:19:40
440
原创 Oracle 库缓存 和shared Cursor (下)
Shared Cursor是Oracle库缓存对象中的一种。是指缓存在库缓存里的sql语句和匿名sql语句所对应的库缓存对象。
2017-06-10 12:58:12
405
原创 Oracle 查询转换 (下)
星型转换 连接谓词推入:表扩展:表移除 使用in-List Iterator 使用 in-List Expansion 使用in-list filter 对In做子查询展开,或者即做子查询展开,又做视图合并。
2017-06-07 00:02:48
635
原创 Oracle中的查询转换简介(上)
Oracle查询转换的概念: 子查询展开 视图合并: 简单视图合并 外连接视图合并 复杂视图合并 星型连接转换 连接谓词推入 连接因式分解 表扩展 表移除
2017-06-06 00:31:09
1710
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人