Java
文章平均质量分 90
end
这个作者很懒,什么都没留下…
展开
-
源码|并发一枝花之BlockingQueue
今天来介绍Java并发编程中最受欢迎的同步类——堪称并发一枝花之BlockingQueue。JDK版本:oracle java 1.8.0_102继续阅读之前,需确保你对锁和条件队列的使用方法烂熟于心,特别是条件队列,否则你可能无法理解以下源码的精妙之处,甚至基本的正确性。本篇暂不涉及此部分内容,需读者自行准备。接口定义BlockingQueue继承自Queue,增加了阻塞...原创 2019-04-25 15:03:34 · 192 阅读 · 0 评论 -
使用spring注解注入属性
1.1. 使用注解以前我们是怎样注入属性的类的实现:public class UserManagerImpl implements UserManager { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = user原创 2017-04-24 11:27:46 · 621 阅读 · 0 评论 -
ExecutorService中submit和execute的区别
在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动、调度、管理线程的一大堆API了。在Java5以后,通过Executor来启动线程比用Thread的start()更好。在新特征中,可以很容易控制线程的启动、执行和关闭过程,还可以很容易使用线程池的特性。 一、创建任务 任务就是一个实现了Runnable接口的类。创建的时候实run方法即可原创 2017-04-24 10:30:41 · 773 阅读 · 0 评论 -
Java动态代理
Java提供的动态代理,是“代理模式”的一个实现。代理模式简介:http://www.cnblogs.com/endlu/p/5169749.html 静态代理有一定的弊端,为每一个被代理类都编写一个代理类会让系统变得臃肿,而且不够灵活。动态代理,是在运行时动态的生成一个代理类和代理对象。解决这方面的问题。 所谓动态代理,在院里上可以这样理解。静态代理的代理类,是事先编原创 2016-02-19 14:29:43 · 760 阅读 · 0 评论 -
基于Anocation的Spring Cache
概述Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果。Spring 的缓存技术还具备相当的灵活性,不仅能够使用 SpEL(Spring原创 2017-04-06 17:26:23 · 1012 阅读 · 0 评论 -
记一次服务停止排查
早上到公司,查看周末日志有没有异常。日志都是按天切割的。发现昨天的日志,大部分都没有。查发布记录,周末没有人发布过。jps,进程也在。而且小部分日志是正常的。问了运维的人员,也没有人手动删除过。试着打开当前的日志,发现最后一条的日期是昨天下午16点。脑子嗡的一下:完了,服务昨天下午就挂了,到现在都没人发现。这个服务对应的模块,用户数比较少,且使用频率较低,用户就没有反馈。查看线程和端口都还在,原创 2017-03-08 16:56:15 · 5006 阅读 · 0 评论 -
Java--文件内存映射--NIO--MapedByteBuffer
java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer。 MappedByteBuffer是java nio引入的文件内存映射方案,读写性能极高。NIO最主要的就是实现了对异步操作的支持。其中一种通过把一个套接字通道(SocketChannel)注册到一个选择器原创 2016-12-09 16:19:49 · 1652 阅读 · 0 评论 -
ThreadLocal内存泄漏详细分析
前言ThreadLocal 的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。但是如果滥用 ThreadLocal,就可能会导致内存泄漏。下面,我们将围绕三个方面来分析 ThreadLocal 内存泄漏的问题ThreadLocal 实现原理ThreadLocal为什么会内存泄漏ThreadLocal 最佳原创 2016-08-23 23:49:22 · 1148 阅读 · 0 评论 -
logback.xml常用配置详解<configuration> and <logger>
一:根节点包含的属性: scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。debug:当此属性设置为true时,将打印出logback内部日志信原创 2016-08-23 20:22:32 · 489 阅读 · 0 评论 -
正确使用Volatile关键字
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。锁提供了两种主原创 2016-04-18 15:38:24 · 6855 阅读 · 1 评论 -
Java序列化的几种方式
本文着重讲解一下Java序列化的相关内容。如果对Java序列化感兴趣的同学可以研究一下。一.Java序列化的作用 有的时候我们想要把一个Java对象变成字节流的形式传出去,有的时候我们想要从一个字节流中恢复一个Java对象。例如,有的时候我们想要把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节原创 2016-04-18 11:13:55 · 20394 阅读 · 0 评论 -
线上性能问题初步排查方法
有时候有很多问题只有在线上或者预发环境才能发现,而线上又不能Debug,所以线上问题定位就只能看日志,系统状态和Dump线程,本文只是简单的介绍一些常用的工具,帮助定位线上问题。问题定位1: 首先使用TOP命令查看每个进程的情况,显示如下:top - 22:27:25 up 463 days, 12:46, 1 user, load average: 11.80, 12原创 2016-04-29 11:42:57 · 2664 阅读 · 0 评论 -
Java中的synchronized
synchronized是针对对象的隐式锁使用的,注意是对象! 举个小例子,该例子没有任何业务含义,只是为了说明synchronized的基本用法: Java代码 Class MyClass(){ synchronized void myFunction(){ //do something } } pu原创 2016-04-11 17:43:38 · 2193 阅读 · 0 评论 -
Java锁----Synchronized实现原理
数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现synchronized的? 本文所指说的JVM是指Hotspot的6u23版本,下面首先介绍synchronized的实现: synchronized关键字简洁、清晰、语义明确,因此即使原创 2016-04-26 12:03:04 · 3234 阅读 · 1 评论 -
Metrics使用简介
Metrics可以为你的代码的运行提供无与伦比的洞察力。作为一款监控指标的度量类库,它提供了很多模块可以为第三方库或者应用提供辅助统计信息, 比如Jetty, Logback, Log4j, Apache HttpClient, Ehcache, JDBI, Jersey, 它还可以将度量数据发送给Ganglia和Graphite以提供图形化的监控。Metrics提供了Gauge、Counter、...原创 2018-05-02 10:00:51 · 5250 阅读 · 0 评论 -
Linux上java进程虚拟内存VIRT占用高的问题
1. 现象最近发现线上机器 java 8 进程的 VIRT 虚拟内存使用达到了 50G+,如下图所示:2. 不管用的 -Xmx首先第一想到的当然使用 java 的 -Xmx 去限制堆的使用。但是无论怎样设置,都没有什么效果。没办法,只好开始苦逼的研究。3. 什么是 VIRT现代操作系统里面分配虚拟地址空间操作不同于分配物理内存。在64位操作系统上,可用的最大虚拟地址空间有16EB,即大概180亿G...原创 2018-05-29 15:13:29 · 18840 阅读 · 1 评论 -
java并发编程--线程中断
使用interrupt()中断线程当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一个标志,表示它已经被中断,并立即返回。这里需要注意的是,如果只是单纯的调用interrupt()方法,线程并没有实际被中断,会继续往下执行。下面一段代码演示了休眠线程的中断:public class SleepIn...原创 2019-05-05 15:49:54 · 296 阅读 · 0 评论 -
源码|并发一枝花之ConcurrentLinkedQueue
首先声明,本文是伪源码分析。主要是基于状态机自己实现一个简化的并发队列,有助于读者掌握并发程序设计的核心——状态机;最后对源码实现略有提及。ConcurrentLinkedQueue不支持阻塞,没有BlockingQueue那么易用;但在中等规模的并发场景下,其性能却比BlockingQueue高不少,而且相当稳定。同时,ConcurrentLinkedQueue是学习CAS的经典案例。根...原创 2019-05-05 11:07:57 · 437 阅读 · 0 评论 -
Java实现生产者-消费者模型
考查Java的并发编程时,手写“生产者-消费者模型”是一个经典问题。有如下几个考点:对Java并发模型的理解 对Java并发编程接口的熟练程度 bug free coding styleJDK版本:oracle java 1.8.0_102本文主要归纳了4种写法,阅读后,最好在白板上练习几遍,检查自己是否掌握。这4种写法或者编程接口不同,或者并发粒度不同,但本质是相同的——...原创 2019-04-24 17:47:10 · 560 阅读 · 0 评论 -
wait/notify/notifyAll使用
在Java中,可以通过配合调用Object对象的wait()方法和notify()方法或notifyAll()方法来实现线程间的通信。在线程中调用wait()方法,将阻塞等待其他线程的通知(其他线程调用notify()方法或notifyAll()方法),在线程中调用notify()方法或notifyAll()方法,将通知其他线程从wait()方法处返回。 Object是所有类的超类...原创 2019-04-24 16:54:23 · 280 阅读 · 0 评论 -
源码|并发一枝花之ReentrantLock与AQS(3):Condition
JDK版本:oracle java 1.8.0_102接口声明public interface Lock { ... Condition newCondition(); ...}public interface Condition { ... void await() throws InterruptedException; bo...原创 2019-04-24 16:03:53 · 166 阅读 · 0 评论 -
源码|并发一枝花之ReentrantLock与AQS(2):lockInterruptibly
JDK版本:oracle java 1.8.0_102接口声明public interface Lock {...void lock();void lockInterruptibly() throws InterruptedException;void unlock();...}Lock#lockInterruptibly()是Lock#lock()的一个...原创 2019-04-23 22:55:58 · 264 阅读 · 0 评论 -
源码|并发一枝花之ReentrantLock与AQS(1):lock、unlock
显示锁ReentrantLock的内部同步依赖于AQS(AbstractQueuedSynchronizer),因此,分析ReentrantLock必然涉及AQS。本文假设读者已熟练掌握AQS的基本原理(参考AQS的基本原理),通过分析ReentrantLock#lock()与ReentrantLock#unlock()的实现原理,用实例帮助读者理解AQS的等待队列模型。JDK版本:...原创 2019-04-23 11:52:56 · 324 阅读 · 0 评论 -
浅谈偏向锁、轻量级锁、重量级锁
为了换取性能,JVM在内置锁上做了非常多的优化,膨胀式的锁分配策略就是其一。理解偏向锁、轻量级锁、重量级锁的要解决的基本问题,几种锁的分配和膨胀过程,有助于编写并优化基于锁的并发程序。内置锁的分配和膨胀过程较为复杂,限于时间和精力,文中该部分内容是根据网上的多方资料整合而来;仅为方便查阅,后面继续分析JVM源码的时候也有个参考。如果对各级锁已经有了基本了解,读者大可跳过此文。隐藏在...原创 2019-04-23 11:50:05 · 741 阅读 · 0 评论 -
正确理解Thread Local的原理与适用场景
ThreadLocal解决什么问题由于 ThreadLocal 支持范型,如 ThreadLocal< StringBuilder >,为表述方便,后文用变量代表 ThreadLocal 本身,而用实例代表具体类型(如 StringBuidler )的实例。不恰当的理解写这篇文章的一个原因在于,网上很多博客关于 ThreadLocal 的适用场景以及解决的问题,描述...原创 2019-03-06 19:23:13 · 459 阅读 · 0 评论 -
JPA 已作废的SQLQuery.class、setResultTransformer方法替换
jpa可以使用setResultTransformer,将查询结果以map返回,key为字段名全大写。hibernate 5.2 之后,SQLQuery.class、setResultTransformer方法已作废,其用法如下:Query query = entityManager.createNativeQuery(sql, clazz);query.unwrap(SQLQuery...原创 2019-01-25 11:23:19 · 6291 阅读 · 8 评论 -
Java并发编程(一)----深入分析Volatile的实现原理
引言在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小,本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深入分析能...原创 2016-04-18 11:47:45 · 717 阅读 · 0 评论 -
JPA屏蔽实体间外键
在用jpa这种orm框架时,有时我们实体对象存在关联关系,但实际的业务场景可能不需要用jpa来控制数据库创建数据表之间的关联约束,这时我们就需要消除掉数据库表与表之间的外键关联。但jpa在处理建立外键时存在一些问题,在stackoverflow上搜索了相关的jpa创建实体对象关联关系但不建立外键这一系列问题后,发现这个是jpa在处理外键时存在一定的bug,官方给出的答复是在hibernate 5...原创 2018-12-14 20:00:21 · 3886 阅读 · 0 评论 -
Springboot中JPA的使用
前言第一次使用 Spring JPA 的时候,感觉这东西简直就是神器,几乎不需要写什么关于数据库访问的代码一个基本的 CURD 的功能就出来了。下面我们就用一个例子来讲述以下 JPA 使用的基本操作。新建项目,增加依赖在 Intellij IDEA 里面新建一个空的 SpringBoot 项目。具体步骤参考SpringBoot 的第一次邂逅。根据本样例的需求,我们要添加下面三个依赖...原创 2018-12-13 16:28:33 · 263 阅读 · 0 评论 -
Java锁----Lock实现原理
Lock完全用Java写成,在java这个层面是无关JVM实现的。在java.util.concurrent.locks包中有很多Lock的实现类,常用的有ReentrantLock、ReadWriteLock(实现类ReentrantReadWriteLock),其实现都依赖java.util.concurrent.AbstractQueuedSynchronizer类,实现思路都大同小原创 2016-04-26 11:35:06 · 19594 阅读 · 1 评论 -
Java静态导入
要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类。 使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名。 静态导入也是JDK5.0引入的新特性,下面以实例来说明静态导入的用法: 比如先在一个包中定义一个这样的类: package com.example.learnja原创 2016-03-15 13:34:46 · 470 阅读 · 0 评论 -
Java线程池源码分析(二)
二.深入剖析线程池实现原理在上一节我们从宏观上介绍了ThreadPoolExecutor,下面我们来深入解析一下线程池的具体实现原理,将从下面几个方面讲解: 1.线程池状态 2.任务的执行 3.线程池中的线程初始化 4.任务缓存队列及排队策略 5.任务拒绝策略 6.线程池的关闭 7.线程池容量的动态调整 1.线程池状态在Th原创 2016-02-29 14:01:06 · 527 阅读 · 0 评论 -
CGlib小记
CGlib是一个强大的代码生成包,常被用于各种AOP框架,提供“拦截”功能。JDK本身就为控制要访问的对象提供了一种途径,动态代理Proxy。但是被代理的累必须实现一个或多个接口。如果想摆脱这个限制,为没有实现借口的类代理的话,可以使用CGlib。下面是一个入门学习的小例子。需求:InfoManager类有四个方法,query、del、create、update。要对这些方法进行访问控制。原创 2014-06-17 14:10:04 · 888 阅读 · 0 评论 -
JNI(2) java与c++的参数传递
所有的本地方法的第一个参数都是指向JNIEnv结构的。这个结构是用来调用JNI函数的。第二个参数jclass的意义,要看方法是不是静态的(static)或者实例(Instance)的。前者,jclass代表一个类对象的引用,而后者是被调用的方法所属对象的引用。1.返回值和参数类型根据等价约定映射到本地C/C++类型。有些类型,在本地代码中可直接使用,而其他类型只有通过JNI调用操作。原创 2013-09-02 00:36:22 · 964 阅读 · 0 评论 -
JNI(1) 在java中调用本地c++代码
公司项目一直存在效率问题,准备试试用c++动态链接库,实现计算量最大的一部分。jni----java本地调用。步骤:1.写java类,在需要在外部实现的方法前用native修饰,只用声明,不实现。2.在java项目bin目录下,用javah -jni 类路径+类名 生成c++用的 test.h头文件3.编写c++. 需include jni.h 和 jni_md.h,原创 2013-08-29 23:17:17 · 999 阅读 · 1 评论 -
Java--------面向对象
1.java中只允许单继承,子类具有父类全部的变量与方法。2.JAVA成员默认权限为Default,在同一个包内可见。3.private私有,只能在该类内访问。4.protested同一个包内,以及该类的子类可以访问。5.public 任何位置都可以访问。6.对于class的权限修饰只可以是public 和 default。-------------------------原创 2013-02-07 18:27:29 · 565 阅读 · 0 评论 -
Java----IO流
java.io包中定义了多个流类型来实现输入输出功能。可分为输入 输出流 、 字节流 字符流 、 接电流 处理流所有流类型位于java.io包内 都分别继承了以下四种抽象流类型。InputStream OutputStream Reader Writer1、节点流:可以从一个特定的数据源(节点)读写数据。即可直接读写、获取。 处理流原创 2013-02-22 16:53:06 · 616 阅读 · 0 评论 -
Java--------多线程
java多线程编程1、run方法 为线程体 为线程执行代码2、start方法 运行线程3、线程的创建:(1)继承Thread类。class End implements Runnable{ public End(){ } public End(String s){ this.name = s; } public void run(){ f原创 2013-02-21 14:18:17 · 762 阅读 · 0 评论 -
Java--------常用类
String StringBuffer 等、1、String类代表代表不可变的字符序列。2、常见构造方法:查询API文档,好多种。3、当创建一个字符串变量时,若已经存在,则不在分配,而是将新变量指向原有位置。即为同一个对象。但是当用new方法创建时则为不同对象。class TestString { public static void main(String[] a原创 2013-02-14 21:56:55 · 549 阅读 · 0 评论 -
Java--------数组
1、数组可以看作是多个相同类型的数据结合,对数据统一管理。2、c中数组可以在栈中,java中为引用类型。3、一维数组:声明 int a[] ; double[] b ; 等 但是不能在声明时指定大小。用new关键字分配内存,放在堆里。 int s[] ; s = new int[5] ;java分配内存时赋了初值。int 为 0 . 但当元素为引用类型时,分配内存原创 2013-02-10 14:53:07 · 556 阅读 · 0 评论