
java
文章平均质量分 65
忧伤的比目鱼
这个作者很懒,什么都没留下…
展开
-
JAVA同步工具类——Semaphore信号量
信号量计数信号量(Counting Semaphore)用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量;Semaphore管理着一组虚拟许可(permit),许可的初始数量可通过构造函数来指定;在执行操作时先获取许可(只要还有剩余的许可),使用完成后释放许可;如果没有许可那么acquire将阻塞直到有许可(或者被中断或操作超时);release方法将返回一个许可给信号量...原创 2018-09-29 22:20:00 · 404 阅读 · 0 评论 -
JAVA线程及线程池异常处理
JAVA线程异常处理在run方法上增加异常处理new Thread(() -> {try {System.err.println(3 / 2);System.err.println(3 / 0);} catch (Exception e) {System.err.println("Catch exception===>" + e.getMessage());}...原创 2018-08-10 23:45:51 · 2392 阅读 · 0 评论 -
synchronized和Lock的区别
Lock以及它的一个实现类ReentrantLock是jdk5新增加的, Lock也可以用于实现多线程的同步区别synchronized既可以加在方法上,也可以加载特定代码块上,而lock需要显示地指定起始位置和终止位置;synchronized是托管给JVM执行(底层使用mutex lock实现),lock的锁定是通过代码实现的,它有比synchronized更精确的线程语义;sy...原创 2018-06-10 15:15:02 · 1493 阅读 · 0 评论 -
一致性hash算法学习
概述在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求,起到负载均衡的作用。但是普通的余数hash(hash(比如用户id)%服务器机器数)算法伸缩性很差,当新增或者下线服务器机器时候,用户id与服务器的映射关系会大量失效。一致性hash则利用hash环对其进行了改进一致性哈希算法特性一致性哈希算法在199...原创 2018-06-09 23:56:36 · 254 阅读 · 0 评论 -
关于Thread.sleep的几个问题
Thread.sleepsleep就是正在执行的线程主动让出CPU,CPU去执行其他线程,在sleep指定的时间过后,CPU才会回到这个线程上继续往下执行,如果当前线程进入了同步锁,sleep方法并不会释放锁,即使当前线程使用sleep方法让出了CPU,但其他被同步锁挡住了的线程也无法得到执行几个问题Thread.sleep(1000),1000ms后是否立即执行?不一定,在未...原创 2018-06-09 19:49:09 · 13272 阅读 · 2 评论 -
JUC五种常见同步工具类总结
JUC常用工具类SemaphoreCountDownLatchCyclicBarrierExchangerPhaser使用场景这五种同步辅助类适用于的同步场景:Semaphore 信号量是一类经典的同步工具。信号量通常用来限制线程可以同时访问的(物理或逻辑)资源数量。CountDownLatch 一种非常简单、但很常用的同步辅助类。其作用是在完成一组正在其他线程中执...原创 2018-06-09 19:46:10 · 5993 阅读 · 0 评论 -
Future模式核心思想
Future模式核心思想Future模式的核心在于:去除了主函数的等待时间,并使得原本需要等待的时间段可以用于处理其他业务逻辑(根据《Java程序性能优化》)Future模式有点类似于商品订单。在网上购物时,提交订单后,在收货的这段时间里无需一直在家里等候,可以先干别的事情。类推到程序设计中时,当提交请求时,期望得到答复时,如果这个答复可能很慢。传统的时一直等待到这个答复收到时再去做别的事...原创 2018-06-09 19:41:39 · 521 阅读 · 0 评论 -
java notify和notifyAll的区别
notify和notifyAll的最主要的区别notify只是唤醒一个正在wait当前对象锁的线程,而notifyAll唤醒所有。值得注意的是:notify是本地方法,具体唤醒哪一个线程由虚拟机控制;如果有多个线程等待,则线程规划器任意挑选出其中一个wait()状态的线程来发出通知调用notify和notifyAll方法后,当前线程并不会立即放弃锁的持有权,而必须要等待当前同步代码块执行...原创 2018-06-09 19:39:04 · 450 阅读 · 0 评论 -
Synchronzied底层实现
synchronized的底层是使用操作系统的mutex lock实现;Mutex Lock监视器锁(Monitor)本质是依赖于底层操作系统的Mutex Lock(互斥锁)来实现的。每个对象都对应于一个可称为” 互斥锁” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象; 互斥锁:用于保护临界区,确保同一时间只有一个线程访问数据。对共享资源的访问,先对互斥量进行加锁,如...原创 2018-06-09 17:03:27 · 415 阅读 · 0 评论 -
记Jedis客户端并发问题
先来看问题,在对分布式锁进行压测时抛出异常:java.lang.ClassCastException: java.lang.Long cannot be cast to [B at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:239) at redis.clients.jedis.Jedis...原创 2018-08-18 23:32:28 · 1328 阅读 · 0 评论 -
CAP理论&ZK&Eureka
如果我们期待实现一套严格满足ACID(Atomicity原子性、Consistency一致性、Isolation隔离性、Durability持久性)的分布式事务,很可能的情况就是系统的可用性和严格一致性出现冲突。在可用性和一致性之间永远无法存在一个两全其美的方案。CAP理论2000年7月,加州大学伯克利分校Eric Brewer教授提出了著名的CAP猜想。2年后,来自麻省理工学院的Se...原创 2018-09-01 17:57:43 · 989 阅读 · 0 评论 -
Socket三次握手四次挥手
Socket 起源于 Unix,而Unix基本哲学之一就是一切皆文件,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符通信模型: s erver的生命周期大致如下:创建socket。绑定(bind)地址端口监听网络...原创 2018-09-03 15:05:00 · 5941 阅读 · 0 评论 -
JAVA同步工具类——CountDownLatch
闭锁在学习CountDownLatch之前,让我们先了解一下闭锁的概念。闭锁是一种同步工具类,可以延迟线程的进度直到其到达终止状态;闭锁的作用相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当到达结束状态时,这扇门会打开并允许所有线程通过;当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态;闭锁可以用来确保某些活动直到其它活动都完成后才继续...原创 2018-09-29 20:46:28 · 424 阅读 · 0 评论 -
Java中集合类遍历性能
集合元素在内存如何存放数据元素在内存中,主要有2种存储方式:1、顺序存储,Random Access(或直接存储,Direct Access):这种方式,相邻的数据元素存放于相邻的内存地址中,整块内存地址是连续的。可以根据元素的位置直接计算出内存地址,直接进行读取。读取一个特定位置元素的平均时间复杂度为O(1)。这种数据结构插入和删除时比较麻烦,查询比较方便。正常来说,只有基于数组实现的集合...原创 2018-09-29 15:44:17 · 870 阅读 · 0 评论 -
Java语法糖之foreach
JAVA集合foreachfor-each其实只是java提供的语法糖。语法糖是编程语言提供的一些便于程序员书写代码的语法,是编译器提供给程序员的糖衣,编译时会对这些语法特殊处理。语法糖虽然不会带来实质性的改进,但是在提高代码可读性,提高语法严谨性,减少编码错误机会上确实做出了很大贡献;Java要求集合必须实现Iterable接口,才能使用for-each语法糖遍历该集合的实例;先看个简单的...原创 2018-09-29 11:20:49 · 940 阅读 · 0 评论 -
设计模式之迭代器模式
迭代器模式定义:提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节迭代器模式的结构抽象迭代器(Iterator)角色:此抽象角色定义出遍历元素所需的接口;迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代,并保持迭代过程中的游标位置;抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等,均都...原创 2018-09-29 00:06:03 · 209 阅读 · 0 评论 -
JAVA类初始化顺序总结
类的初始化 {#articleHeader1}初始化顺序首先来看下,当一个类从main入口方法,对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序:public class ClassLoadTest {private static User user = new User();static {System.err.println("static code block...原创 2018-09-27 23:16:24 · 17956 阅读 · 2 评论 -
JAVA对象实例化方式总结--及Unsafe黑科技
JAVA对象实例化的方法本贴主要对JAVA实例化方式做个简单的总结,尤其是Unsafe的方式,可能很多人都没了解过,这个是sun工程师留的一个后门,可以称为“黑科技”New对象实例// 直接new对象实例Productor productor = new Productor();注意:任何类都有构造方法,但是new指令只能创建非抽象类的对象;构造方法不能是静态的,因为静态方法不能使用t...原创 2018-09-27 17:47:27 · 1004 阅读 · 0 评论 -
常见的缓存失效策略
常见的缓存失效策略常见的几种缓存失效策略,总结一下:FIFO ,first in first out ,最先进入缓存的数据在缓存空间不够情况下(超出最大元素限制时)会被首先清理出去LFU , Less Frequently Used ,一直以来最少被使用的元素会被被清理掉。这就要求缓存的元素有一个hit 属性,在缓存空间不够得情况下,hit 值最小的将会被清出缓存。LRU ,Least ...原创 2018-09-19 13:30:03 · 3221 阅读 · 0 评论 -
JAVA——TreeSet学习笔记
TreeSetTreeSet是基于TreeMap的NavigableSet实现。使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序,具体取决于使用的构造方法。这句话什么意思呢?就是说,跟HashSet底层是一个HashMap来维护类似,TreeSet的底层实现就是一个TreeMap,自然也就具备了对元素排序的功能【知识点】TreeSet基于TreeMa...原创 2018-09-24 00:20:45 · 274 阅读 · 0 评论 -
Synchronzied锁对象之包装类
synchronized锁对象为包装类型(修饰变量)synchronized锁对象为包装类型时,需要考虑包装类型的缓存,如Integer默认缓存-127~128之间的数值,所以下例中锁a和锁b实际锁的是同一个对象;另外其它包装类也需要注意类似问题(如Byte/Short);public static Integer valueOf(int i) {if (i >= IntegerC...原创 2018-06-09 16:57:56 · 958 阅读 · 0 评论 -
Java类的初始化
平常在写代码的过程中,一般不会注意到类的初始化过程,如果类中有代码块,静态域时,初始化的顺序是怎么样的? 先上代码:public class Application { public static void main(String[] args) { Student stu = new Student(); }}class Person { ...原创 2018-06-08 18:56:17 · 335 阅读 · 0 评论 -
【转载】Jar包冲突问题及解决方案
作者:sherlockyb 链接:https://www.jianshu.com/p/100439269148 关于JAR包冲突问题,几乎是码农经常会遇到的问题,博客看到这篇文章,总结的非常棒,以下是转载的原文概述Jar包冲突是老生常谈的问题,几乎每一个Java程序猿都不可避免地遇到过,并且也都能想到通常的原因一般是同一个Jar包由于maven传递依赖等原因被引进了多个不同的版...转载 2018-06-08 13:02:34 · 2916 阅读 · 0 评论 -
JAVA单例模式总结
单例模式定义:确保某一个类只有一个实例,自行实例化并且想整个系统提供这个实例。使用场景:避免某个类产生多个对象而消耗过多的资源,确保某个类在程序中只有一个实例;单例模式的优点:对于频繁使用的对象,可以省略new操作花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC的压力,缩短GC停顿时间; ...原创 2018-04-13 23:09:13 · 192 阅读 · 0 评论 -
JVM注解@CallSensitive
JVM注解@CallSensitive@CallSensitive是JVM中专用的注解,在类加载过过程中是可以常常看到这个注解的身影的,@CallSensitive用来找到真正发起反射请求的类@CallSensitive的使用@CallerSensitivepublic static Class<?> forName(String className)throws ...原创 2018-04-18 23:52:51 · 668 阅读 · 0 评论 -
volatile和synchronized比较
volatile和synchronized比较 synchronized关键字解决的是执行控制的问题,它会阻止其它线程获取当前对象的监控锁,这样就使得当前对象中被synchronized关键字保护的代码块无法被其它线程访问,也就无法并发执行。更重要的是,synchronized还会创建一个内存屏障,内存屏障指令保证了所有CPU操作结果都会直接刷到主存中,从而保证了操作的内存可见性,同时也使得先获...原创 2018-04-18 23:48:39 · 261 阅读 · 0 评论 -
JAVA线程安全之volatile
volatilevolatile原理是基于CPU内存屏障(Memory Barrier)指令实现的;如果一个变量被 volatile 关键字修饰时,那么对这的变量的写是将本地内存中的拷贝刷新到共享内存中;对这个变量的读会有一些不同,读是无视本地内存拷贝,只是从共享变量中去读取数据并拷贝到本地工作内存;volatile并不能真正保证线程安全,它只能确保一个线程修改了共享数据后,其他线程能...原创 2018-04-13 11:41:09 · 349 阅读 · 0 评论 -
JAVA编程hashCode笔记
定义:hashCode就是根据存储在一个对象实例中的所有数据,提取出一个32位的整数,该整数的目的是用来标示该实例的唯一性;有点类似于MD5码,每个文件都能通过MD5算法生成一个唯一的MD5码。不过,Java中的hashCode并没有真正的实现为每个对象生成一个唯一的hashCode,还是会有一定的重复几率public native int hashCode();哈希码产生的依...原创 2018-04-18 15:12:40 · 213 阅读 · 0 评论 -
JAVA之Unsafe学习笔记
sun.misc.Unsafe作用:可以用来在任意内存地址位置处读写数据,支持一些CAS原子操作 Java最初被设计为一种安全的受控环境。尽管如此,HotSpot还是包含了一个后门sun.misc.Unsafe,提供了一些可以直接操控内存和线程的底层操作。Unsafe被JDK广泛应用于java.nio和并发包等实现中,这个不安全的类提供了一个观察HotSpot JVM内部结构并且可以对其进行修改,原创 2018-04-12 18:33:39 · 4638 阅读 · 0 评论 -
JAVA线程池ThreadPoolExecutor学习笔记
ThreadPoolExecutorpublic ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, Tim...原创 2018-05-03 09:32:14 · 222 阅读 · 0 评论 -
JAVA常用术语汇总
OOD(Object Oriented Design):面向对象的设计OOA(Object Oriented Analysis):面向对象的分析OOP(Object Oriented Programming):面向对象编程;面向对象是一种编程范式,满足面向对象编程的语言,一般会提供类、封装、继承等语法和概念来辅助我们进行面向对象编程。所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的...原创 2018-05-03 23:54:10 · 5843 阅读 · 0 评论 -
JAVA基础String学习探究
StringString是JAVA中最常用的对象,就是这样一个最常用最普通的对象,当你深入研究时却发现我们并不是真的很了解它,那么让我们一起来学习它吧!因为String不可变的性质,因此Java内部实现了常量池。当一个String被创建时,会先去常量池查看有没有值相同的示例,有的话直接返回。节省了内存,加快了字符串的加载速度。不可变的对象也可以保证在并发中保持线程安全特性字符串常...原创 2018-05-04 09:53:42 · 260 阅读 · 0 评论 -
POJO&JavaBean区别
概念POJO(Plain Old Java Object):普通Java类,POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象;JavaBean:javaBean是一种Java语言写成的可重用组件。为写成JavaBean,类必须是具体和公共的,并且具有无参数的构造器。JavaBean通过提供符合一致性设计模式的公共方法将内部域暴露成员属性。更...原创 2018-05-04 23:40:53 · 207 阅读 · 0 评论 -
JAVA final深入理解
Java的关键字final通常是指被它修饰的数据是不能被改变的,不想改变可能出于两种理由:设计或效率。主要特性:final数据的使用final参数的使用final方法的使用final类不能被继承final数据1.1 final修饰变量final 变量一经初始化,就不能改变其值这里的值对于一个对象或者数组来说指的是这个对象或者数组的引用地址。因此,一个线程定义了一个...原创 2018-04-26 23:57:09 · 264 阅读 · 0 评论 -
动态代理之JDK动态代理&CGLib动态代理
JDK动态代理核心思想:通过实现被代理类的所有接口,生成一个字节码文件后构造一个代理对象,通过持有反射构造被代理类的一个实例,再通过invoke反射调用被代理类实例的方法,来实现代理。缺点:JDK动态代理的对象必须实现一个或多个接口 流程图知识点JDK实现动态代理需要实现类通过接口定义业务方法JDK生成的代理类以”$Proxy”为开头进行命名JDK代理生成的代理类的...原创 2018-04-26 22:58:24 · 642 阅读 · 0 评论 -
JDK之Float源码解析
概述Java的Float类主要的作用就是对基本类型float进行封装,提供了一些处理float类型的方法,比如float到String类型的转换方法或String类型到float类型的转换方法,当然也包含与其他类型之间的转换方法 java float类型用IEEE754标准规定;float占用4个字节,包括:1bit(符号位):0表示正数,1表示负数;8bits(指数位)...原创 2018-05-04 18:54:23 · 596 阅读 · 0 评论 -
JAVA之long和double读写操作原子性
Java虚拟机规范定义的许多规则中的一条:所有对基本类型的操作除了某些对long类型和double类型的操作之外,都是原子级的; 当线程把主存中的 long/double类型的值读到线程内存中时,可能是两次32位值的写操作,显而易见,如果几个线程同时操作,那么就可能会出现高低2个32位值出错的情况发生。即long,double高低位问题,非线程安全举例说明:即如有一个long类型...原创 2018-05-10 23:43:36 · 3680 阅读 · 0 评论 -
java.lang.Integer源码分析
Integer 本文源码基于JDK8Integer也是我们经常使用的工具类、包装类,此文主要用于记录学习笔记,主要从源码角度深入了解一下。public final class Integer extends Number implements Comparable<Integer> { // 2147483647 public static fin...原创 2018-05-04 15:16:56 · 641 阅读 · 0 评论 -
JAVA StringBuilder&StringBuffer学习
StringBuilder&StringBuffer 本文源码基于JDK8StringBuilder与StringBuffer是两个常用的操作字符串的类。StringBuilder是线程不安全的,而StringBuffer是线程安全的;StringBuilder、StringBuffer都继承自AbstractStringBuilderabstract class A...原创 2018-05-04 12:03:27 · 144 阅读 · 0 评论