
java
丹江怒潮
这个作者很懒,什么都没留下…
展开
-
ReentrantLock实现原理
ReentrantLock主要利用CAS+CLH队列来实现。它支持公平锁和非公平锁,两者的实现类似。ReentrantLock的基本实现可以概括为:先通过CAS尝试获取锁。如果此时已经有线程占据了锁,那就加入CLH队列并且被挂起。当锁被释放之后,排在CLH队列队首的线程会被唤醒,然后CAS再次尝试获取锁。在这个时候,如果:非公平锁:如果同时还有另一个线程进来尝试获取,那么有可能会让这...原创 2019-10-14 10:34:18 · 311 阅读 · 0 评论 -
java学习系列2(多线程三)
本文主要接着前面多线程的两篇文章总结Java多线程中的线程安全问题。一.一个典型的Java线程安全例子 1 public class ThreadTest { 2 3 public static void main(String[] args) { 4 Account account = new Account("123456", 1000);转载 2017-10-25 13:49:04 · 220 阅读 · 0 评论 -
Google EventBus 使用详解
EventBus是Google.Guava提供的消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发布消息。首先使用 maven 依赖:[java] view plain copy//mvnrepository.com/artifact/com.google.转载 2017-10-16 17:56:06 · 415 阅读 · 0 评论 -
java学习系列3(集合hashmap)
HashMap原理详解HashMap一 定义和创建 HashMap实现了Map接口,继承AbstractMap类。AbstractMap中包含了map的基本功能。 (1) 初始大小static final int DEFAULT_INITIAL_CAPACITY = 1 4; // aka 16从源码可以看出大小是16(1左移动4位1000 =转载 2017-10-25 14:02:03 · 189 阅读 · 0 评论 -
java学习系列3(集合ConcurrentHashMap)
前言以前写过介绍HashMap的文章,文中提到过HashMap在put的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就是rehash,这个会重新将原数组的内容重新hash到新的扩容数组中,在多线程的环境下,存在同时其他的元素也在进行put操作,如果hash值相同,可能出现同时在同一数组下用链表表示,造成闭环,导致在get时会出现死循环,所以HashMap是线程不安全转载 2017-10-26 14:48:58 · 214 阅读 · 0 评论 -
java学习系列4(内存模型)
Java内存模型上面讲到了Java线程之间的通信采用的是过共享内存模型,这里提到的共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以转载 2017-10-26 15:20:20 · 183 阅读 · 0 评论 -
Protobuffer和json深度对比
JSON相信大家都知道是什么东西,如果不知道,那可就真的OUT了,GOOGLE一下去。这里就不介绍啥的了。Protobuffer大家估计就很少听说了,但如果说到是GOOGLE搞的,相信大家都会有兴趣去试一下,毕竟GOOGLE出口,多属精品。Protobuffer是一个类似JSON的一个传输协议,其实也不能说是协议,只是一个数据传输的东西罢了。那它跟JSON有什么区别呢?转载 2017-11-17 14:22:55 · 386 阅读 · 0 评论 -
java学习系列4(Java 内存区域和GC机制)
目录Java垃圾回收概况Java内存区域Java对象的访问方式Java内存分配机制Java GC机制垃圾收集器Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代 码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在J转载 2017-10-26 17:10:13 · 239 阅读 · 0 评论 -
java学习系列4(类加载机制及反射)
一、Java类加载机制1.概述 Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通过该元信息对象可以获知Class的结构信息:如构造函数,属性和方法等,Java允许用户借由这个Class相关的元信息对象间接调用Class对象的功能。 虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始转载 2017-09-29 11:03:33 · 266 阅读 · 0 评论 -
序列化之protobuf与avro对比(Java)
序列化之protobuf与avro对比(Java) 最近在做socket通信中用到了关于序列化工具选型的问题,在调研过程中开始趋向于用protobuf,可以省去了编解码的过程。能够实现快速开发,且只需要维护一份协议文件即可。 但是调研过程中发现了protobuf的一些弊端,比如需要生成相应的文件类,和业务绑定太紧密,所以在看了AVRO之后发现它完美解决了这个问题转载 2017-11-17 14:41:46 · 2313 阅读 · 0 评论 -
五分钟读懂UML类图
平时阅读一些远吗分析类文章或是设计应用架构时没少与UML类图打交道。实际上,UML类图中最常用到的元素五分钟就能掌握,下面赶紧来一起认识一下它吧:一、类的属性的表示方式在UML类图中,类使用包含类名、属性(field) 和方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee类,它包含name,age和email这3个属性,以及modifyInfo()方法。那么属性/方法...转载 2018-03-15 13:25:06 · 148 阅读 · 0 评论 -
框架开发之Java注解的妙用
注解的好处:1.能够读懂别人写的代码,特别是框架相关的代码。2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以使用一个或者多个注解来替代,这样就使得编程更加简洁,代码更加清晰。3.(重点)刮目相看。(但是怎么样才能让别人刮目相看呢?会用注解不是目的,最重要的是要使用自定义注解来解决问题。)举个栗子:如果面试的时候,你跟老板说你会使用注解,老板觉得你这个人还行;但是如果老板发现你会自定...转载 2018-03-16 09:47:28 · 169 阅读 · 0 评论 -
Xml命名空间浅析
XML实例在介绍xml命名空间之前,我们先来看段xml代码:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" x...转载 2018-06-19 16:54:06 · 751 阅读 · 1 评论 -
java学习系列2(多线程二)
本文承接上一篇文章《Java总结篇系列:Java多线程(一)》。四.Java多线程的阻塞状态与线程控制上文已经提到Java阻塞的几种具体类型。下面分别看下引起Java线程阻塞的主要方法。1.join()join —— 让一个线程等待另一个线程完成才继续执行。如A线程线程执行体中调用B线程的join()方法,则A线程被阻塞,知道B线程执行完为止,A才能得以继续执行。转载 2017-10-25 13:47:31 · 160 阅读 · 0 评论 -
java学习系列2(多线程一)
JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。1、继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的转载 2017-10-25 11:31:58 · 262 阅读 · 0 评论 -
jvm垃圾回收器
一、垃圾回收算法标记-清除(Mark-Sweep):此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除。此算法需要暂停整个应用,同时,会产生内存碎片。复制(Copying):此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区原创 2017-08-16 14:29:23 · 497 阅读 · 0 评论 -
restful理解
rest的翻译是表现层状态转移那么什么是表现层呢?表现层指的是一个具体存在的物体,这个物体可能是一个图片或者网页等。这个物体包含两个属性,一个是位置用URI表示。二个是表现形式,比如网页数据可以用浓缩的xml或者json表示,也可以用html表示。那么什么是状态转移呢?指的是通过http的四种手段(post get put delete)来操作表现层,使其发生变化。原创 2017-08-11 16:04:01 · 205 阅读 · 0 评论 -
Java系列笔记(3) - Java 内存区域和GC机制
目录Java垃圾回收概况Java内存区域Java对象的访问方式Java内存分配机制Java GC机制垃圾收集器Java垃圾回收概况 Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,也不需要像C程序员那样战战兢兢。这是因为在Java虚拟机中,存转载 2017-08-14 16:18:45 · 239 阅读 · 0 评论 -
Java NIO 经典实例代码
server端代码:import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey;转载 2017-08-14 11:30:20 · 4028 阅读 · 1 评论 -
volatile 和 lock
Volatile 作用是保证读取变量都会去主内存取变量,变量运算完立即刷新回主内存,而普通变量,则是把变量从主内存读取后,放在栈内存,可能会放一段时间后才会刷新回主内存。但volatile并不是线程安全的,因为线程取到volatile变量后进行写操作时,可能别的线程也正在读取。主要用于一个线程写,很多线程在读的情景。将该变量用volatile修饰可以保证修改后,其余的线程都能立即看到。原创 2017-08-15 14:26:05 · 592 阅读 · 0 评论 -
CopyOnWrite容器理解
什么是CopyOnWrite容器CopyOnWrite容器即写时复制的容器。通俗的理解是当我们往一个容器添加元素的时候,不直接往当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后新的容器里添加元素,添加完元素之后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,因为当前容器不会添加任何元素。所以CopyOnWrite原创 2017-08-15 16:10:26 · 400 阅读 · 0 评论 -
HashMap和ConcurrentHashMap
HASHMAP原理Hashmap是数组和链表的集合体,即key是以数组来储存,value是以链表储存 默认的容量是16,加载因子是0.75,达到16*0.75 = 12会触发自动扩容系统总是将新添加的 Entry对象放入 table数组的 bucketIndex索引处——如果 bucketIndex索引处已经有了一个 Entry对象,那新添加的 Entry对原创 2017-08-15 16:37:41 · 214 阅读 · 0 评论 -
深入理解Java的接口和抽象类
对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲:一.抽象类 二.接口 三.抽象类和接口的区别一.抽象类在了解抽象类之转载 2017-09-27 11:11:40 · 186 阅读 · 0 评论 -
Java基础学习总结——面向对象
一、面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别, 作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该分析这个问题里面有哪些类和对象,这是第一点,然后再分析这些类和对象应该具有哪些属性和方法。这是第二点。最后分析类和类之间具体有什么关系,这是第三点。转载 2017-09-27 11:30:03 · 206 阅读 · 0 评论 -
log4j框架logger的继承关系以及使用场景
log4j日志框架logger是存在继承关系的,我们一般都会在log4j.properties文件中定义log4j.rootLogger。其他所有logger都继承自这个rootLooger。考虑下面这种场景:假如我们有2个类HelloLog4j和A。[java] view plain copypackage aty.log; impo转载 2017-07-14 09:42:37 · 273 阅读 · 0 评论 -
java学习系列2(并发锁问题-乐观锁与悲观锁以及乐观锁的一种实现方式-CAS)
Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synch转载 2017-10-28 11:49:22 · 324 阅读 · 0 评论 -
java学习系列1(面向对象)
一、面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别, 作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该分析这个问题里面有哪些类和对象,这是第一点,然后再分析这些类和对象应该具有哪些属性和方法。这是第二点。最后分析类和类之间具体有什么关系,这是第三点。转载 2017-10-25 11:13:49 · 210 阅读 · 0 评论 -
如何获取行政区域的边界gps数据
使用附件的html网页用IE打开,即可原创 2017-08-16 10:32:39 · 4926 阅读 · 0 评论