javase
文章平均质量分 74
Oo此岸花开oO
这个作者很懒,什么都没留下…
展开
-
JAVA多线程——死锁分析
线程死锁的原因:当两个或多个线程正在等待对方占有的锁,死锁就会发生死锁会导致两个线程无法继续运行,被永远挂起。线程0想要lock1,线程1想要lock0,双方都在等待对方释放锁简单的死锁例子创建两个互相等待对方释放锁的线程public class DeadLock1 implements Runnable { private Object o1原创 2016-03-29 09:38:53 · 661 阅读 · 0 评论 -
JVM——JVM调优工具
Sun JDK 监控和故障处理工具1.jps (JVM Process Status Tool)显示指定系统内所有的HotSpot虚拟机进程2.jstat(JVM Statstisics Monitoring Tool)用于收集HotSpot虚拟机各方面的运行数据3.jinfo(Configuration Info for java)显示虚拟机配置信息4.jmap(Me原创 2016-03-27 21:05:53 · 390 阅读 · 0 评论 -
JAVA多线程——notify()和notifyAll()的注意事项
1. - waiting on —— 对应java.lang.Thread.State: WAITING表示线程执行到了锁的wait()方法上由于wait()方法会释放锁,所以当前线程此时处于未获取锁状态,等待notify() || notifyAll()2. - waiting to lock —— 对应java.lang.Thread.State: BLOCKED表示锁已经原创 2016-03-28 13:33:40 · 633 阅读 · 0 评论 -
JMM——线程间通信
在并发编程中,我们需要处理两个关键问题:1. 线程之间如何通信 通信是指线程之间以何种机制来交换信息,在命令式编程(c语言)中,线程之间的通信机制有两种: 1.1 共享内存 在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。 JAVA并发采用的是共享内存模型,java线程之间的通信总是隐式进行,整个通信过程对程序员完全透原创 2016-03-28 20:16:09 · 1231 阅读 · 0 评论 -
JAVA线程同步——synchronized
问题:如何在多线程环境下安全地共享变量首先理解一个概念:临界区临界区是一个用来访问共享资源的代码块,这个代码块在同一个时间允许一个线程执行JAVA中使用synchronized来声明一个方法或者一段代码块为临界区每个对象只有一个锁,当它被某线程占有了,其他想获取锁的线程就只能阻塞synchronized的语义:1.对象锁在同一个对象的临界区,同一时间只能有一个允许被访问原创 2016-03-27 09:52:47 · 366 阅读 · 0 评论 -
JVMGC——基本垃圾回收算法
按照基本回收策略分:1. 引用计数原理是此对象有一个引用就增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只回收计数为0的对象。 缺点:无法处理循环引用的问题 2. 标记-清除 此算法执行分两阶段:1. 从引用根节点开始标记所有被引用的对象2. 遍历整个堆,把未标记的对象清除。缺点:此算法需要暂停整个应用,会产生内存碎片原创 2016-03-27 16:46:32 · 519 阅读 · 0 评论 -
Httpclient4.5
1.传递表单参数的方式:一般第一种就可以解决问题1.1 StringEntity entity =new StringEntity("a=1&b=2", "UTF-8");1.2 public static StringEntity createEntity(Map params) { StringEntity entity = null; Lis原创 2016-05-30 22:25:36 · 512 阅读 · 0 评论 -
一般Spring MVC项目问题排查经验
开发中总会遇上的这样那样的情况 : 这参数怎么没有传过来/传的值不对复制过来的代码怎么效果不一样在本地是好的啊怎么上线就挂了,这不科学好吧, 这里就分享一些开发中遇到问题快速定位的小经验,主要针对基于 Spring MVC 和 Mybatis的一般Web项目,旨在找出问题所在而非问题的解决方案。一次HTTP请求和服务器的交互过程 ,基本分为三部分 :原创 2017-02-07 20:42:42 · 1696 阅读 · 1 评论 -
JUnit4的入口类 - JUnitCore
概述JUnitCore作为JUnit4的入口类(包含了静态的main方法),定义了一系列方法来启动JUnit完成对测试类的反射执行编程方式使用 :public static void main(String[] args) { Result result = JUnitCore.runClasses(MyTest.class); // 测试类的class对象原创 2017-11-06 12:51:56 · 2429 阅读 · 0 评论 -
JUnit4之BlockJUnit4ClassRunner
Runner概述JUnit对Runner的定位为负责执行测试方法和通知测试的Listener可以通过@Runwith来执行自定义Runner在每次执行测试方法之前都会通过反射创建一个新的测试类对象,这回导致测试类中的成员变量无法在每个测试方法调用中保持相同的值(需要在@Before和@After中进行重置) , 在JUnit5中可以通过@TestInstance(L原创 2017-11-06 15:11:14 · 3106 阅读 · 0 评论 -
JUnit4总体介绍
关键类Statement可执行单元,也就是我们的测试方法和测试类FrameworkMember保存反射获取的成员变量和方法集合实现类为FrameworkMethod 和 FrameworkFieldDescription用来描述一个test(将要执行或者已经被执行(failure))的状态提供测试运行的feedback,比如IDE提供的tree view原创 2017-11-06 11:54:34 · 449 阅读 · 0 评论 -
JUnit5总体介绍
JUnit5是什么官网介绍如下 :JUnit 5 is the next generation of JUnit. The goal is to create an up-to-date foundation for developer-side testing on the JVM. This includes focusing on Java 8 and above, as w原创 2017-11-07 09:56:55 · 1463 阅读 · 0 评论 -
java多线程——监视锁(monitor)
java中每个对象都有唯一的一个monitor,想拥有一个对象的monitor的话有以下三种方式:1.执行该对象的同步方法public synchronize a () {}2.执行该对象的同步块synchronize(obj) {}3.执行某个类的静态同步方法public static synchronize b(){}tips:拥有monitor的是线程原创 2016-03-28 18:34:15 · 17497 阅读 · 2 评论 -
JMM——运行时数据区
Java虚拟机运行时数据区1 程序计数器(Program Counter Register) 1.1 程序计数器是一块较小的线程私有的内存空间,可以看作是当前线程锁执行的字节码的行号指示器。 1.2 如果线程正在执行的是一个Java方法,记录的是正在执行的虚拟机字节码指令的地址 1.3 如果执行的是Native方法,计数器值为空(Undefined原创 2016-03-27 16:23:42 · 602 阅读 · 0 评论 -
JAVA多线程开发——线程的创建与运行
JAVA中创建线程的方式有两种:1.实现Runnable接口,使用Thread的参数为Runnable类的构造函数创建Thread对象2.继承Thread类,覆盖run方法线程的启动:直接调用上述Thread或者Runnable的run()方法仅仅是普通的方法调用,并不会真正启动一个线程只有调用start()方法才会创建并启动一个线程实现Runnab原创 2016-03-26 20:42:55 · 403 阅读 · 0 评论 -
JAVA的String、StringBuilder和StringBuffer
问题:String、StringBuilder和StringBuffer的区别三者的来历:String(JDK1.0) —— 不可变字符序列StringBuffer(JDK1.0) —— 线程安全的可变字符序列StringBuilder(JDK1.5) —— 非线程安全的可变字符序列 三者都用value[]原创 2016-03-26 16:58:22 · 249 阅读 · 0 评论 -
JMM——重排序与内存屏障
重排序在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序重排序有三种类型:1.编译器优化的重排序编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序2.指令级并行的重排序现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序3.内存系统的重排序由于处理器使用缓存和读/写缓冲区,这使转载 2016-03-30 09:28:01 · 3132 阅读 · 2 评论 -
JVMGC——并发收集器(CMS)
CMS(Concurrent Mark Sweep)收集器C : ConcurrentM : 标记(marking)对象 :GC必须记住哪些对象可达,以便删除不可达的对象 S : 清除(sweeping) : 删除未标记的对象并释放它们的内存CMS是一种以最短停顿时间为目标的收集器,使用CMS并不能达到GC效率最高,但它尽可能降低GC时服务的停顿时间。使用标记转载 2016-03-27 19:28:11 · 6619 阅读 · 1 评论 -
JVMGC——堆内存的分代
分代的垃圾回收策略基于对对象声明周期分析后得出的垃圾回收算法。把对象分为年青代、年老代和持久代,对不同声明周期的对象使用不同的算法年轻代: 一个Eden区,两个Survior区 ,使用复制回收算法所有新生成的对象首先都是放置在年轻代(Eden区)的年轻代的目标就是尽可能快速地收集掉那些生命周期短的对象年轻代回收过程:1. 当Eden区满时,转载 2016-03-27 18:49:41 · 520 阅读 · 0 评论 -
java线程同步——CountDownLatch
java.util.concurrent.CountDownLatchCountDownLatch允许线程等待一组在其他线程中执行的操作完成之后才继续执行这个类通过指定一个整数初始化内部计数器,这个整数就是线程要等待完成的操作的数目当一个线程要等待某些操作先执行时,需要调用await()方法让线程进入休眠直到所有操作完成当某一个操作完成的时候,它将调用countDown()方法原创 2016-03-27 15:28:46 · 518 阅读 · 0 评论 -
java线程同步——信号量(Semaphore)
java.util.concurrent.Semaphore信号量是一种计数器,用来保护一个或者多个共享资源的访问,它是并发编程的一种基础工具。信号量通过计数器的方式来对资源进行访问控制当其计数器值大于0时,表示有资源可以访问当其计数器值等于0时,线程将进入休眠状态直到计数器值大于0通过信号量的构造函数指定资源数量:private final Semaphore s转载 2016-03-27 14:55:39 · 870 阅读 · 0 评论 -
JAVA线程同步——消费者和生产者模式
场景介绍我们有一个数据缓冲区,一个或者多个生产者把数据存入这个缓冲区,一个或者多个消费者从缓冲区中取出数据缓冲区中的是共享数据当缓冲区满的时候不能生产者将不能再放入数据到缓冲区(生产者线程阻塞)当缓冲区空的时候消费者不能从缓冲区中读取数据(消费者线程阻塞)实例:1. 创建数据处理类,其中缓冲区的保存、读取、生产操作public class EventStorag转载 2016-03-27 13:42:52 · 468 阅读 · 0 评论 -
JMM——重排序与happens-before
数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分为下列三种类型: 上述三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变只有编译器和处理器在重排序时会遵守数据依赖性,它们不会改变存在数据依赖性关系的两个操作的执行顺序。但是不同处理器之间和不同线程之间的数据依赖性不被编译器和处理器考虑 a转载 2016-03-30 09:49:09 · 960 阅读 · 0 评论 -
JMM——volatile的内存语义
volatile理解volatile特性的一个好方法:把对volatile变量的单个读/写,看成是使用同一个锁对这些单个读/写操作做了同步 锁的happens-before规则保证释放锁和获取锁的两个线程之间的内存可见性,这意味这对一个volatile变量的读,总是能看到任意线程对这个volatile变量最后的写入值锁的语义决定了临界区代码的执行具有原子性如果是多个vo转载 2016-03-30 10:01:44 · 1947 阅读 · 0 评论 -
JMM——volatile与内存屏障
为了实现volatile内存语义,JMM会分别限制编译器重排序和处理器重排序1.当第一个操作为普通的读或写时,如果第二个操作为volatile写,则编译器不能重排序这两个操作(1,3)2.当第一个操作是volatile读时,不管第二个操作是什么,都不能重排序。这个规则确保volatile读之后的操作不会被编译器重排序到volatile读之前(第二行)3.当第一个操作转载 2016-03-30 13:08:08 · 16194 阅读 · 5 评论 -
JAVA中Object的equals和hashCode的关联
问题:为啥equals和hashCode方法必须一起重写?有什么需要注意的吗?hachCode —— 根据对象内存地址生成的hash值java.lnag.Object中对hashCode的约定: 1. 在一个应用程序执行期间,如果一个对象的equals方法用于比较的信息没有被修改的话,则这个对象调用hachCode()得到的结果都是相同的。不要求不同的应用程序保持对象的hash原创 2016-03-26 16:13:26 · 471 阅读 · 0 评论 -
java锁——ReentrantLock
java.util.concurrent.locks.LockLock接口与synchronized的区别:1.Lock接口允许分离读和写操作,允许多个读线程和只有一个写线程2.在高并发的环境下,Lock性能更好3.支持更灵活的同步代码块结构,可以让锁的获取和释放不在同一个代码块使用Lock接口的一般模式: private final Lock lock原创 2016-03-27 14:05:11 · 327 阅读 · 0 评论 -
JAVA多线程——线程的中断
JAVA中的线程中断1.Thread.interrupt() —— 设置interrupted为true源码:public void interrupt() { if (this != Thread.currentThread()) checkAccess(); synchronized (blockerLock) {原创 2016-03-26 22:09:51 · 321 阅读 · 0 评论 -
JAVA多线程——线程的休眠和恢复
线程休眠的两种方式:1. Thread.sleep()与锁操作无关,如果该方法恰好在一个锁的保护范围之内,当前线程即使在执行sleep()的时候,仍然继续保持监视锁。 sleep方法实际上仅仅是完成等待或者睡眠的语义2.Object.wait()当线程执行到wait()方法上,当前线程会释放监视锁,此时其他线程可以占有该锁一旦wait()方法执行完成,当原创 2016-03-26 22:29:57 · 3656 阅读 · 0 评论 -
JAVA多线程——线程运行时异常的处理
线程异常的处理1. 非运行时异常(Unchecked Exception) 必须捕获并处理,因为run()方法并不支持throws语句2.运行时异常(Runtime Exception) 2.1默认在控制台输出异常信息 2.2设置UncaughtException异常处理器来自定义处理操作异常处理器:实现Thread.UncaughtExceptionHandl原创 2016-03-26 23:20:43 · 5925 阅读 · 0 评论 -
JUnit5的启动 - Launcher
Launcher概述Launcher是JUnit5的启动类,也是对启动进行扩展的主要入口,扩展通过实现自定义的TestEngine来自定义测试类的发现和执行逻辑以达到定制化测试的目的Launcher启动示例代码public static void main(String[] args) { //设置搜索和过滤规则 LauncherDiscoveryReq原创 2017-11-07 10:11:44 · 4078 阅读 · 1 评论