java
时光吹老了好男孩
非诚勿扰
展开
-
NIO的理解
NIO是同步非阻塞,核心是通道和缓冲区,通道用于传输数据,缓冲区用于存储数据。1.缓冲区可以保存多个相同类型的数据,例如:ByteBuffer CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer MappedByteBuffer ShortBuffer2.通道和选择器Channel和Selector F...原创 2019-09-15 16:42:43 · 147 阅读 · 0 评论 -
CAS是什么及底层原理
个人理解:CAS全称CompareAndSwap(比较并交换),是一种硬件对并发支持所设计的特殊指令,实现了无锁的非阻塞算法。算法主要是包含读写值,期望值,更新值,当期望值与主内存读到的值相等时,才会通过原子方式更新主内存值,否则就表示已有其它线程更新过主内存的值,这时当前线程CAS指令继续循环读取值 做比较 直到相等为止,才更新成功,结束指令。CAS底层主要实现类为UnSafe类,为...原创 2019-08-01 00:50:49 · 947 阅读 · 0 评论 -
CountDownLatch、CyclicBarrier、Semaphore
CountDownLatch:让一些线程阻塞直到另一些线程完成操作才被唤醒;完成操作时计数器减为0,阻塞线程被唤醒。public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDow...原创 2019-08-04 16:02:57 · 106 阅读 · 0 评论 -
读写锁 ReadWriteLock
多个线程可以同时去读取同一个资源,但是每次只能有一个线程去写资源,不应该有其它线程去写资源。写资源时应该满足原子和独占性。读-读 能共存读-写不能共存写-写不能共存class MyCache{ private volatile Map map = new HashMap(); private ReadWriteLock lock = new Reentra...原创 2019-08-04 14:52:36 · 92 阅读 · 0 评论 -
自旋锁
CAS思想就是典型的自旋锁。自旋锁的概念是采用循环的方式去获取锁,直到获取到锁为止,好处是减少线程上下文的切换,坏处是循环消耗CPU。原创 2019-08-04 13:35:43 · 80 阅读 · 0 评论 -
可重入锁和递归锁
可重入锁也称递归锁。可重入锁指的是同一个线程进入外层函数获得锁,内层同步函数仍然可以使用该锁,并且不会发生死锁。ReentrantLock和synchronized默认都是可重入锁。class Phone implements Runnable{ //可重入锁 ReentrantLock Lock lock = new ReentrantLock(); ...原创 2019-08-04 13:29:00 · 152 阅读 · 0 评论 -
公平锁 和非公平锁的含义和区别
公平锁:多线程按照申请锁的顺序来获取锁,不会出现争抢的情况。非公平锁:多线程不会按照顺序获取锁,会先尝试去争抢锁,有可能后申请的线程比先申请的线程先抢到锁,在高并发情况下,可能会造成优先级反转和饥饿的现象。(例如ReentrantLock默认为非公平锁)区别:公平锁就是很公平,争抢锁的几率一样,每个线程会先看等待队列是否为空,若为空,直接获取锁,若不为空,自动排队等候获取锁;非公平锁...原创 2019-08-03 23:09:51 · 4084 阅读 · 0 评论 -
接口和抽象类的区别
1.抽象类可以有构造方法,接口没有2.抽象类方法可以有public protected default这些修饰符,而接口只能用public3.抽象类可以有默认方法是实现的,接口方法不能实现4.抽象类单继承,接口多实现5.抽象方法比接口速度快,因为接口需要去寻找类中实现的方法...原创 2019-07-26 00:46:42 · 78 阅读 · 0 评论 -
分布式环境中并发问题
在分布式环境中,处理并发问题就没办法通过操作系统和JVM的工具来解决,那么在分布式环境中,可以采取一下策略和方式来处理:避免并发时间戳串行化数据库行锁统一触发途径避免并发在分布式环境中,如果存在并发问题,那么很难通过技术去解决,或者解决的代价很大,所以我们首先要想想是不是可以通过某些策略和业务设计来避免并发。比如通过合理的时间调度,避开共享资源的存取冲突。另外,在并行任务设计上...转载 2019-07-28 23:00:41 · 557 阅读 · 0 评论 -
同步异步,阻塞非阻塞的区别
1.同步异步:消息通知机制 同步:当发起调用时,被调用者需要执行完才返回结果,调用者要主动等待结果返回。 异步:发起调用后,被调用者直接返回,但是并没有返回结果,被调用者处理完通过状态或通知等通知调用者,调用者被动接受结果。2.阻塞非阻塞:程序等待结果时的状态 阻塞:调用结果返回之前,程序不释放cpu,直接挂起线程,不能做其他事情,直到结果返回,才能继续往下执行。 ...原创 2018-10-24 19:42:12 · 116 阅读 · 0 评论 -
面向对象的基本原则
五个基本原则单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。 开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。 Lis...原创 2018-07-11 14:33:42 · 377 阅读 · 0 评论 -
ConcurrentHashMap在jdk7和8中的实现原理
jdk7: 在jdk7中是以数组+分段锁(segement)+链表的方式实现,Segment继承自ReentrantLock 使用分段锁的方式是将数据分成一块一块的存储,然后给每一块数据配一把锁,当一个线程访问一块数据的时候,其它线程也可以访问其它块的数据,实现并发访问,大大提高并发访问的能力。 jdk8:在jdk8中是以数组+链表+红黑树的方式实现,彻底放弃Segeme...原创 2019-07-28 00:39:20 · 304 阅读 · 0 评论 -
HashMap的长度为什么要是2的幂次方
HashMap存储数据时要避免位置碰撞且数据分配均匀,于是采用位移运算的算法计算存储链表的位置,假设HashMap的长度不为2的幂次方则有可能产生碰撞,例如例如长度为9时候,3&(9-1)=0 2&(9-1)=0 ,都在0上,碰撞了;例如长度为8时候,3&(8-1)=3 2&(8-1)=2 ,不同位置上,不碰撞;...原创 2019-07-28 00:54:29 · 1251 阅读 · 0 评论 -
23种设计模式
1.创建型模式:单例模式、抽象工厂模式、工厂模式、原型模式、建造者模式 5种2.结构型模式:适配器模式、装饰模式、桥接模式、组合模式、外观模式、享元模式、代理模式 7种3.行为型模式:模板方法模式、命令模式、访问者模式、迭代器模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、责任链模式 11种...原创 2019-09-08 23:19:55 · 108 阅读 · 0 评论 -
synchronized和lock的区别
1.synchronized是关键字,属于jvm层面;monitorenter(底层是通过monitor对象来完成,wait/notify也依赖于monitor对象只有在同步块和方法中才能调用wait/notify等方法) monitorexit(包括正常退出和异常退出两种); 而lock是一个类,属于api层面2.synchronized执行完同步代码,自动释放锁;Lock锁必须在fi...原创 2019-08-11 19:38:03 · 159 阅读 · 0 评论 -
线程池底层工作原理和流程
当提交任务执行excute时1.若正在运行的线程数量小于corePoolSize,则线程池马上创建线程执行任务2.如果正在运行的线程数量大于等于corePoolSize,则多余的任务加入阻塞队列等待3.如果队列满了且正在运行的线程数量小于maximumPoolSize,那么还要创建非核心线程执行没有加入队列的任务4.如果队列满了且正在运行的线程数量大于或等于maximumPoolS...原创 2019-08-10 17:38:04 · 179 阅读 · 0 评论 -
自定义线程池和合理配置线程数
不要用Excutors定义线程池,用ThreadPoolExcutor自定义public class ExcutorDemo { public static void main(String[] args) { //ExecutorService threadPool = Executors.newFixedThreadPool(20);//一池20个线程 ...原创 2019-08-09 23:49:38 · 504 阅读 · 0 评论 -
线程池七大参数
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...原创 2019-08-09 21:43:19 · 3672 阅读 · 0 评论 -
ThreadLocal的作用和原理
ThreadLocal是用来创建当前线程的局部变量的类,创建的变量只能被当前线程访问和修改原理:set方法的原理:1.首先获取当前线程对象2.利用当前线程获取ThreadLocalMap对象3.如果ThreadLocalMap对象不为空,则设置值,否则创建这个Map对象并设置值由此可看出ThreadLocal变量的值是放入了当前线程创建的ThreadLocalMap对象中,...原创 2019-07-28 21:30:06 · 243 阅读 · 0 评论 -
创建线程池的几种方式以及线程池的好处
线程池的好处大致有三种:1.降低资源消耗2.提高响应速度3.提高线程的可管理性。使用线程池可以进行资源的统一分配、调优和监控。Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制...转载 2019-07-28 17:27:12 · 2409 阅读 · 0 评论 -
什么是死锁以及怎么排查死锁
死锁是指两个或两个线程自己持有锁并去争抢其他资源造成的互相等待的现象。产生死锁的主要原因:1.因为系统资源不足2.进程运行推进的顺序不合适3.资源分配不当产生死锁的四个必要条件:1.互斥条件2.占有且等待3.不可强行占有4.循环等待条件/** * 死锁case */public class DeadLock implements Runnable{...原创 2019-07-28 16:46:23 · 2392 阅读 · 1 评论 -
java多线程间的通信方式
通过共享变量,每个线程主动去读取共享变量的值,为了保证变量的并发同步,需要加volatile修饰 采用sleep/while无限循环方式,一个线程sleep后,另外的线程while轮询检测机制,但是此种方式比较浪费cpu资源,故不建议采用 采用wait/notify等待通知机制,当前线程调用wait()方法后,会释放对象锁,另外的线程如果持有对象锁之后,调用notify(),会随机唤醒一个正在...原创 2019-07-28 16:29:38 · 259 阅读 · 0 评论 -
java 实现Runnable接口方式的优势
1、适合多个相同程序的线程去处理统一资源的情况,把相同线程代码和数据有效分离,体现了面向对象的思想2、可以避免java单继承带来的局限性原创 2018-05-20 19:08:50 · 1433 阅读 · 0 评论 -
HashMap在jdk7和jdk8中的实现原理 以及LinkedHashMap的实现原理
HashMapjdk7中的实现原理: HashMap map = new HashMap(); 1.假设创建hashMap(key1,value1),初始化时会创建一个默认长度为16的Entry[]数组 map.put(key1,value1) 2.向map中执行put操作时,首先会调用key1所在类的hashCode()方法计算出hash值...原创 2018-05-06 01:59:35 · 957 阅读 · 0 评论 -
Annotation 注解
Annotation分为两种,第一种为系统内置注解,第二种为自定义注解。系统内置注解:例如@Override,@Dprecated自定义注解:定义格式为 【public】 @interface Annotation名称{ 数据类型 变量名称();}其中数据类型和变量自定义,不作限制。Retention和RetentionPolicy在Annotation中,可以使用Retention定义个A...原创 2018-04-24 00:01:15 · 130 阅读 · 0 评论 -
线程状态和终止线程
stop()和detroy()方法已被jdk启用,不推荐使用终止方法:通常的做法是提供一个boolean型的终止变量,当这个变量置为false,则终止线程的运行。【示例11-3】终止线程的典型方法(重要)1234567891011121314151617181920212223242526272829public class TestThreadCiycle implements Runnable...原创 2018-03-14 17:58:53 · 278 阅读 · 0 评论 -
线程、进程、程序区别
线程和进程最根本的区别在于线程是调度和执行的单位,而进程是资源分配的单位;线程是进程的一部分,所以线程又被成为轻量级进程;一个没有线程的进程看做是单线程的;线程只能共享它所属进程的资源。程序是静态的实体;而进程是动态的实体,有自己的生命周期;进程是程序的一部分,程序运行时产生进程。...原创 2018-03-14 17:35:01 · 132 阅读 · 0 评论 -
juc
1. JUC 简介在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类,用于定义类似于线程的自定义子系统,包括线程池,异步 IO 和轻量级任务框架;还提供了设计用于多线程上下文中的 Collection 实现等;2. volatile 关键字volatile 关键字: 当多个线程进行操作共享数据时,可以保证内存中的数据是可...转载 2018-03-28 23:59:59 · 1156 阅读 · 0 评论 -
eclipse 智能提示
1、java智能提示(1). 打开Eclipse,选择打开" Window - Preferences"。(2). 在目录树上选择"Java-Editor-Content Assist",在右侧的"Auto-Activation"找到"Auto Activation triggers for java"选项。默认触发代码提示的就是"."这个符号。(3). 在"Auto Activation tri.转载 2018-03-28 11:24:08 · 113 阅读 · 0 评论 -
java 实现多线程的四种方式
1.继承Thread类创建线程2.实现Runnable创建线程3.实现Callable接口通过FutureTask包装器来创建线程4.使用ExecutorService、Callable、Future实现有返回结果的线程ExecutorService、Callable、Future三个接口实际上都是属于Executor框架。返回结果的线程是在JDK1.5中引入的新特征,有了这种特征就不需要再为了得...原创 2018-03-30 14:38:53 · 137 阅读 · 0 评论 -
面向对象(二、值传递)
函数调用中传递参数时,遵循原则: 基本类型传递的是参数本身的值,引用类型传递的是对对象的引用,不是对象本身。原创 2018-03-14 14:54:18 · 124 阅读 · 0 评论 -
面向对象(一、思想)
面向对象设计思想:从现实客观事物出发构造软件系统,并在系统构造中尽量使用人类思维方式,更加强调人类在日常思维逻辑中的思想方法和原则。对象是静态属性和动态属性的封装体;类是同一类型的事物的模板。...原创 2018-03-14 14:32:41 · 107 阅读 · 0 评论 -
java并发Lock接口
使用lock()获取锁,unlock()释放锁。import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class PrintDemo { private final Lock queueLock = new ReentrantLock(); public void p...原创 2018-03-16 14:36:40 · 124 阅读 · 0 评论 -
socket双向通信
客户端import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.net.InetAddress;import java.net...原创 2018-03-15 23:59:31 · 975 阅读 · 0 评论 -
遍历集合方法总结
遍历List方法一:普通for循环1234for(int i=0;i<list.size();i++){//list为集合的对象名 String temp = (String)list.get(i); System.out.println(temp);}遍历List方法二:增强for循环(使用泛型!)123for (String temp : list) {System.out....原创 2018-03-15 22:25:12 · 161 阅读 · 0 评论 -
二叉树和红黑二叉树
二叉树是树形结构的一个类型,由一个根节点和左子树、右子树组成。排序二叉树特性:左子树上的值均小于根节点的值;右子树的值均大于根节点的值。(相当于链表)平衡二叉树 任何节点的两个子树的最大高度差为1,被称为高度平衡树。 节点的平衡因子是它的左子树的高度减于右子树的高度(有时相反),平衡因子是1,0,-1的是被认为平衡的。...原创 2018-03-15 22:24:01 · 851 阅读 · 0 评论 -
容器(map接口)
map的实现类主要包括HashMap、HashTable、TreeMap、Properties。HashMap采用哈希算法实现,要求键不能重复,如果发生重复,新的键会替代旧的键。 HashMap底层实现采用了哈希表,这是一种非常重要的数据结构。对于我们以后理解很多技术都非常有帮助(比如:redis数据库的核心技术和HashMap一样),因此,非常有必要让大家理解。 数据结构中由数组和链表...原创 2018-03-15 21:56:16 · 153 阅读 · 0 评论