LuoMing's Blog

小白成长记


  • 首页

  • 分类

  • 归档

[redis学习笔记]主从节点间连接超时判断

发表于 2018-11-10 | 分类于 redis学习笔记 | 阅读次数:

redis主从节点之间会建立一个连接用于复制数据,该连接由从节点收到slave of命令或者cluster replicate(集群模式下)后发起建立到主节点的连接,主从节点均会定时判断该连接是否超时(这个判断过程在replicationCron函数中实现),如果被判断超时,会断开该连接,从节点需要重新建立连接,继续同步数据。

阅读全文 »

TreeSet,LinkedHashSet以及HashSet之间的区别

发表于 2018-04-09 | 分类于 java学习笔记 | 阅读次数:

原文链接:Difference between TreeSet, LinkedHashSet and HashSet in Java with Example

TreeSet,LinkedHashSet以及HashSet均实现了Set接口,因此他们都遵循Set接口的协议,比如他们都不允许重复的元素。尽管他们都来自同一类型的层次结构,但是他们之间还是有很多区别;理解他们之间的区别非常重要,这样您就可以根据您的需求选择最合适的集合实现。另外,TreeSet和HashSet(或者LinkedHashSet)之间的区别是一个非常流行的Java集合面试题,虽然不如“比较Hashtable和HashMap”或者“比较ArrayList和Vector”这类问题普遍,但是依然出现在各种Java面试中。在这篇文章中,我们将看看HashSet,TreeSet以及LinkedHashSet在各个方面之间的区别,比如元素顺序、性能、是否允许null值等,然后我们会看到在Java中什么时候使用TreeSet、LinkedHashSet、HashSet。

阅读全文 »

[java1.8源码笔记]SynchronousQueue详解

发表于 2018-03-19 | 分类于 java1.8源码笔记 | 阅读次数:

概述

SynchronousQueue是一种特殊的阻塞队列,不同于LinkedBlockingQueue、ArrayBlockingQueue等阻塞队列,其内部没有任何容量,任何的入队操作都需要等待其他线程的出队操作,反之亦然。任意线程(生产者线程或者消费者线程,生产类型的操作比如put,offer,消费类型的操作比如poll,take)都会等待直到获得数据或者交付完成数据才会返回,一个生产者线程的使命是将线程附着着的数据交付给一个消费者线程,而一个消费者线程则是等待一个生产者线程的数据。它们会在匹配到互斥线程的时候就会做数据交易,比如生产者线程遇到消费者线程时,或者消费者线程遇到生产者线程时,一个生产者线程就会将数据交付给消费者线程,然后共同退出。在java线程池newCachedThreadPool中就使用了这种阻塞队列。

阅读全文 »

[java1.8源码笔记]ThreadPoolExecutor详解

发表于 2018-03-05 | 分类于 java1.8源码笔记 | 阅读次数:

概述

在java线程池一文中,我们提到java线程池的创建都是由ThreadPoolExecutor类实现,并且介绍了该类的构造函数参数的含义,本文详细分析java1.8中ThreadPoolExecutor源码,分析线程池的具体实现。

阅读全文 »

[java学习笔记]java线程池

发表于 2018-03-02 | 分类于 java学习笔记 | 阅读次数:

概述

我们都知道线程的创建和销毁过程开销比较大,如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,此时推荐使用线程池来复用线程,使得线程执行完一个任务并不被销毁,而是继续执行其他任务。然而线程池的实现相对比较复杂,于是java并发包中帮我们实现了一个功能强大的线程池。java线程池负责管理工作线程,包含一个等待执行的任务队列。线程池的任务队列是一个Runnable集合,工作线程负责从任务队列中取出并执行Runnable对象。

阅读全文 »

[java1.8源码笔记]ReentrantReadWriteLock详解

发表于 2018-03-01 | 分类于 java1.8源码笔记 | 阅读次数:

概述

在并发场景中用于解决线程安全的问题,我们几乎会高频率的使用到独占式锁,通常使用java提供的关键字synchronized或者concurrents包中实现了Lock接口的ReentrantLock。它们都是独占式获取锁,也就是在同一时刻只有一个线程能够获取锁。而在一些业务场景中,大部分只是读数据,写数据很少,如果仅仅是读数据的话并不会影响数据正确性(出现脏读),而如果在这种业务场景下,依然使用独占锁的话,很显然这将是出现性能瓶颈的地方。针对这种读多写少的情况,java还提供了另外一个实现Lock接口的ReentrantReadWriteLock(读写锁)。

ReentrantReadWriteLock,读写锁或者重入读写锁,它维护了一个读锁和一个写锁,它允许同一时刻被多个读线程访问,而此时写线程不能获取到锁,并且当写线程获取到锁时后续的读写线程都将被阻塞不能获取到锁。读写锁保证了写操作对后续的读操作的可见性。同时ReentrantReadWriteLock还支持重入,公平性选择以及锁的降级。

阅读全文 »

[java1.8源码笔记]ReentrantLock详解

发表于 2018-02-28 | 分类于 java1.8源码笔记 | 阅读次数:

概述

ReentrantLock是java并发包中实现的可重入互斥锁,基于AQS实现,支持公平锁与非公平锁两种实现方式。公平锁是指当同步等待队列中有线程在排队获取锁时,新加入的准备获取锁的线程则加入同步等待队列尾;非公平锁是指新加入的准备获取锁的线程,不管同步等待队列中是否有线程正在排队,而直接先尝试获取锁,如果获取失败则加入同步等待队列尾。

阅读全文 »

[java1.8源码笔记]ConcurrentHashMap剖析

发表于 2018-02-09 | 分类于 java1.8源码笔记 | 阅读次数:

概述

ConcurrentHashMap是HashMap的线程安全版本,可以用来替代HashTable,HashTable的线程安全是通过用synchronized关键词来修饰每个方法来实现,,即Hashtable是针对整个table的锁定,同一时刻只能有一个方法被一个线程执行,这样就导致HashTable容器在竞争激烈的并发环境下表现出效率低下。而在java1.8中ConcurrentHashMap通过CAS来实现非阻塞的无锁线程安全、在操作hash值相同的hash桶时用synchronized锁住链表头结点来实现线程安全,锁粒度更小,并发性更高。

阅读全文 »

[java1.8源码笔记]AbstractQueuedSynchronizer详解

发表于 2018-02-09 | 分类于 java1.8源码笔记 | 阅读次数:

概述

AbstractQueuedSynchronizer又称队列同步器(简称AQS),它是用来构建锁和其他同步组件的基础框架,在ReentrantLock、ReentrantReadWriteLock、ThreadPoolExecutor等类中均有应用。AQS内部通过一个int类型的成员变量state来控制同步状态,当state=0时,则说明没有任何线程占有共享资源的锁,当state=1时,则说明有线程目前正在使用共享变量,其他线程必须加入同步等待队列进行等待,AQS内部通过内部类Node构成FIFO的同步队列来完成线程获取锁的排队工作。

阅读全文 »

[java1.8源码笔记]CAS介绍

发表于 2018-02-07 | 分类于 java1.8源码笔记 | 阅读次数:

概述

CAS,在java并发应用中通常指CompareAndSwap或CompareAndSet,即比较并交换。它比较一个内存位置的值并且只有等于预期值时才修改这个内存位置的值为新的值,如果有其他线程在这期间修改了内存位置的值则CAS操作失败。CAS返回是否成功或者内存位置原来的值用于判断是否操作成功。即CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

阅读全文 »
12

罗明

20 日志
4 分类
39 标签
© 2019 罗明
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4