并发编程(八)并发安全
摘要:
什么是线程安全 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在调用代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。 线程封闭 把对象封装到一个线程里,只有这一个线程能看到此对象。那么这个对象就算不是线程安全的也不会
redis集群 相关
摘要:
redis集群中如果有3对主从节点,其中有一对挂掉 集群还能正常工作吗?(不能) 1.正常启动3对主从节点的集群,查看集群节点信息 2.kill掉当前的一个主节点6379 发现,与6379对应的从节6389点变为主节点,仍能正常从集群查询数据 3.关闭6389主节点,并进行数据查询 发现获取数据异常
并发编程(七)线程池
摘要:
为什么使用线程池 Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理地使用线程池能够带来3个好处。 第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。//Thread t = new Thread(); run
位运算
摘要:
二进制 我们日常使用的是十进制,而计算机中则使用的是二进制 十进制:逢十进一 二进制:逢二进一 常用位运算 1) 位与 & (1&1=1 0&0=0 1&0=0) 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0 2) 位或 | (1|1=1 0|0=0 1|0=1) 两个相应的二进制位中
Hash哈希
摘要:
Hash概念: Hash,一般翻译为“散列”,或者音译为“哈希”。就是把任意长度的输入(又叫做预映射,per-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转化是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以并不能从散列值确定
并发编程(六)并发容器
摘要:
1.7中HashMap死循环分析 put()方法 综合来说,HashMap一次扩容的过程: 1、取当前table的2倍作为新table的大小 2、根据算出的新table的大小new出一个新的Entry数组来,名为newTable 3、轮询原table的每一个位置,将每个位置上连接的Entry,算出在
并发编程(五)AQS
摘要:
1.CLH队列锁 CLH队列锁即Craig, Landin, and Hagersten (CLH) locks。 CLH队列锁本身也是一种基于链表的可扩展,高性能,公平的自旋锁,申请线程仅仅在本地变量上自旋,它不断轮询前驱的状态,假设发现前驱释放了锁就结束自旋。 当一个线程需要获取锁时,会创建一个
并发编程(四)显示锁
摘要:
1.显示锁 Java程序可以依靠synchronized关键字隐式的获取锁实现锁功能,但是它将锁的获取和释放固话了,也就是先获取再释放。 (synchronized是语言的特性(内置锁),Lock是一个类 使用的时候需要对其实例化 和方法调用,内存,CPU消耗较大。且JDK中对synchonized
Java中的几种代码块
摘要:
静态代码块: 有些代码需要在项目启动的时候就执行,就需要使用静态代码块。它是主动执行的,在项目启动的时候就初始化,也仅仅在第一次类加载的时候执行,之后不再执行 静态方法: 有些代码是在不创建对象的情况下,由其他程序来调用的,就需要使用静态方法。它是被动执行的,静态方法在类加载的时候就已经加载了,可以
并发编程(三)原子操作CAS
摘要:
1.CAS(Compare And Swap)原子操作: 假定有两个操作A和B,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,那么A和B对彼此来说是原子的。 通过锁,锁机制可以实现原子操作,但锁一般是阻塞的如synchronize关键字就是基于阻塞的锁机制,当一