
————并发
量变决定质变
牢记理想,毋忘奋斗!
展开
-
ConcurrentMap接口
ConcurrentMap接口两个实现 ConcurrentHashMap ConcurrentSkipListMap 支持并发排序功能,弥补ConcurrentHashMapConcurrentHashMap 内部使用段Segment,来表示这些不同的部分 每个段,其实就是一个小的HashTable,它们有自己的锁 只有多个修改操作,发生在不同的段上,就可以并发进行每一个...原创 2018-09-03 10:03:05 · 523 阅读 · 0 评论 -
Synchronize同步
Volatile多线程之间的可见性 但是,不具备同步性,也就是原子性可以算是一个轻量级synchronized 性能比synchronized强很多,不会造成阻塞在很多开源架构里 比如,netty的底层代码,就大量使用volatile 可见,netty性能一定非常不错Volatile 用于只针对多个线程的可见性的变量操作 并不能,代表synchronize的同步功能...原创 2018-09-01 10:03:24 · 682 阅读 · 0 评论 -
Volatile可见性
Volatile使变量在多个线程可见 每一个线程都会有一块工作内存区 其中,存放着所有线程共享的主内存中的变量值的拷贝当线程执行时 在自己的工作区内存中,操作这些变量共享内存当主内存中变量值改变时,会写到相应线程的工作内存中 为了存取一个共享变量,一个线程通常,先获取锁定,并去清除它的内存工作区把这些共享变量从所有线程的共享内存中,正确的装载到它自己所在工作内存中,...原创 2018-09-01 10:00:27 · 335 阅读 · 0 评论 -
ConcurrentLInkedQueue队列
ConcurrentLInkedQueue适用于高并发场景下的队列 基于连接节点的,无界线程安全队列通过无锁的方式 实现了高并发状态下的高性能先进先出 队列元素,遵循先进先出的原则 头是最先加入的,尾是最近加入的null 队列不允许null元素性能 性能好与BlockingQueue主要方法Add()、offer() 都是加入元素,两个方法没有任何区别...原创 2018-09-04 10:02:29 · 343 阅读 · 0 评论 -
SynchronousQueue队列
SynchronousQueue一种没有缓存的队列生产者产生的数据 直接会被消费者获取,并消费package com.bjsxt.base.coll013;import java.util.ArrayList;import java.util.List;import java.util.concurrent.ArrayBlockingQueue;import java....原创 2018-09-04 10:00:02 · 282 阅读 · 0 评论 -
LInkedBlockingQueue队列
LInkedBlockingQueue也称为无界队列 基于链表的阻塞队列内部维持着一个数据缓冲队列 该队列由一个链表构成之所以能够高效的处理并发数据 因为,内部实现采用分离锁,读写分离两个锁 从而,实现生产者、消费者操作的完全并行运行package com.bjsxt.base.coll013;import java.util.ArrayList;import j...原创 2018-09-04 09:58:44 · 365 阅读 · 0 评论 -
ArrayBlockingQueue队列
ArrayBlockingQueue也称为有界队列 基于数组的阻塞队列实现内部,维护了一个定长数组,便于缓存队列中的数据对象 内部,没有实现读写分离,意味着生产者、消费者不能完全并行长度需要定义,不指定会报错 可以指定先进先出,或者先进后出package com.bjsxt.base.coll013;import java.util.ArrayList;import...原创 2018-09-04 09:56:34 · 707 阅读 · 1 评论 -
Synchronize对String加锁
Synchronize尽量,不要使用String常量加锁 会出现死循环问题package com.bjsxt.base.sync006;/** * synchronized代码块对字符串的锁,注意String常量池的缓存功能 * */public class StringLock { public void method() { // new S...原创 2018-08-30 08:51:58 · 1256 阅读 · 3 评论 -
Synchronize对象属性改变
对象属性改变使用一个对象进行加锁时如果,对象本身不发生改变,依然是同步的 对象属性,发生改变,不会影响同步package com.bjsxt.base.sync006;/** * 同一对象属性的修改不会影响锁的情况 * */public class ModifyLock { private String name; private int age;...原创 2018-08-29 08:47:31 · 483 阅读 · 0 评论 -
Synchronize对象改变
Synchronize对象锁改变 当对一个对象加锁时如果,对象本身发生改变,那么,持有的锁就不同了 如果,对象本身不改变,那么,依然是同步的package com.bjsxt.base.sync006;/** * 锁对象的改变问题 * */public class ChangeLock { private String lock = "lock"; ...原创 2018-08-29 08:45:58 · 450 阅读 · 0 评论 -
AtomicInteger原子性
AtomicInteger保证多线程,可见变量的原子性package com.bjsxt.base.sync007;import java.util.concurrent.atomic.AtomicInteger;/** * volatile关键字不具备synchronized关键字的原子性(同步) * */public class VolatileNoAtomic e...原创 2018-09-01 10:04:29 · 482 阅读 · 0 评论 -
线程通信
线程通信线程是操作系统中独立的个体 但是,这些个体如果不经过特殊的处理,就不能成为一个整体 线程通信,就是成为整体的必要方式之一当线程存在通信指挥 系统间的交互性会更强大,提高CPU利用率的同时 使开发人员对线程任务,在处理的过程中进行有效的把握与监督实现方式Wait/notify方法 可以实现线程间的通信这两个方法,都是Object类的方法 Java所有的对象...原创 2018-09-01 10:07:52 · 199 阅读 · 0 评论 -
线程通信wait与notify
Wait/notify可以实现线程间的通信Wait方法,释放锁 Notify方法,不释放锁Wait与notify方法 必须配置synchronize使用package com.bjsxt.base.conn008;import java.util.ArrayList;import java.util.List;import java.util.Queue;impo...原创 2018-09-01 10:10:01 · 246 阅读 · 0 评论 -
CopyOnWrite容器
CopyOnWrite也称为COW,写时复制容器 用于程序设计中的优化策略JDK中COW容器,有两种 CopyOnWriteArrayLIst CopyOnWriteArraySetCOW容器 非常有用,可以在非常多的并发场景中使用 当往一个容器添加元素的时候,不直接往当前容器添加 而是,先将当前容器进行Copy,复制出一个新的容器 然后,新的容器里添加元素实现过程 ...原创 2018-09-03 10:01:21 · 487 阅读 · 0 评论 -
并发类容器
并发类容器JDK 1.5之后,提供了多种并发类容器 来代替同步类容器,改善性能同步类容器 状态都是串行化的,虽然,实现了线程安全 但是,严重降低了并发性,在多线程环境中 严重降低了应用程序的吞吐量并发类容器 专门针对并发设计 使用ConcurrentHashMap来,代替给予散列的传统的HashTable 在ConcurrentHashMap中,添加了一些常见复合操作的支...原创 2018-09-03 09:59:24 · 213 阅读 · 0 评论 -
同步类容器
同步类容器是线程安全的但是,在某些场景下 可能需要加锁来保护复合操作复合类操作,比如 迭代,反复访问元素、遍历完容器中所有元素 跳转,根据指定的顺序,找到当前元素的下一个元素 以及条件运算等这些复合操作在多线程,并发的修改容器时 可能会表现出意外的行为,经典的是ConcurrentModificationException 因为,当容器迭代的过程中,被并发的修改了内容 ...原创 2018-09-03 09:57:25 · 244 阅读 · 0 评论 -
单例模式与多线程
单例模式常见的饥饿模式和懒汉式模式饥饿模式 直接实例化对象懒汉式模式 在第一次调用方法的时候,进行实例化对象多线程这两种模式,性能与线程安全上都是有问题的 一般使用双重确认,或者静态内部类的方式Dubble check instance Static inner class双重确认package com.bjsxt.base.conn011;pu...原创 2018-09-02 09:14:46 · 193 阅读 · 0 评论 -
ThreadLocal的使用
ThreadLocal线程局部变量 是一种多线程间,并发访问变量的解决方案与synchronized等加锁的不同 ThreadLocal完全不提供锁,使用以空间换时间的手段 为每个线程提供变量的独立版本,以保障线程安全性能 ThreadLocal不具有绝对的优势 在并发不是很高的时候,加锁的性能会更好作为一套与锁完全无关的线程安全解决方案 在高并发量,或者竞争激烈的场景...原创 2018-09-02 09:12:32 · 222 阅读 · 0 评论 -
Queue队列使用
Queue队列,支持阻塞机制 阻塞放入与得到数据实现LinkedBlockingQueue 下面的方法put与takePut 把一个Object加入到BlockingQueue里面 如果,BlockQueue没有空间,调用此方法的线程被阻断 直到BlockingQueue里面有空间再继续执行Take 取走BlockingQueue里面,排在首位的对象 如果,Block...原创 2018-09-02 09:09:44 · 511 阅读 · 0 评论 -
Synchronize对String加锁解决
Synchronize尽量,不要使用String常量加锁 会出现死循环问题new String 可以使用new String加锁package com.bjsxt.base.sync006;/** * synchronized代码块对字符串的锁,注意String常量池的缓存功能 * */public class StringLock { public vo...原创 2018-08-30 08:54:17 · 2163 阅读 · 0 评论 -
CountDownLatch实时通信
CountDownLatch可以实现线程,实时通信Await方法,等待 countDown方法,通知区别CountDownLatch,不需要配合synchronize使用 Wait/notify,必须配合synchronize使用package com.bjsxt.base.conn008;import java.util.ArrayList;import j...原创 2018-09-01 10:15:47 · 280 阅读 · 0 评论 -
线程通信轮询
轮询方式轮询,可以实现线程通信package com.bjsxt.base.conn008;import java.util.ArrayList;import java.util.List;public class ListAdd1 { private volatile static List list = new ArrayList(); public ...原创 2018-09-01 10:12:07 · 418 阅读 · 0 评论 -
Synchronize死锁
Synchronize死锁双方互相持有,对方的锁 导致,程序无法继续执行package com.bjsxt.base.sync006;/** * 死锁问题,在设计程序时就应该避免双方相互持有对方的锁的情况 * */public class DeadLock implements Runnable { private String tag; private...原创 2018-08-24 19:19:25 · 869 阅读 · 0 评论 -
Synchronize锁对象
Synchronize锁对象可以对任意的Object对象,进行加锁 用法比较灵活package com.bjsxt.base.sync006;/** * 使用synchronized代码块加锁,比较灵活 * */public class ObjectLock { public void method1() { synchronized (this) ...原创 2018-08-23 10:08:04 · 731 阅读 · 0 评论 -
Synchronize锁粒度
Synchronize锁粒度如果,a线程调用不同的方法,执行一个很长时间的任务 那么,b线程就必须等待很长的时间,才能执行可以通过减小锁的粒度,去优化代码执行时间package com.bjsxt.base.sync006;/** * 使用synchronized代码块减小锁的粒度,提高性能 * */public class Optimize { publi...原创 2018-08-23 10:06:22 · 1129 阅读 · 0 评论 -
Java线程的生命周期
Java中,任何对象都有生命周期,线程也有自己的生命周期 当Thread对象创建完成时,线程的生命周期就开始了,当run()方法中代码正常执行完毕,或者线程抛出一个未捕获的异常Exception或者错误Error时,线程的生命周期便会结束线程整个生命周期,可以分为五个阶段,分别是新建状态New、就绪状态Runnable、运行状态Running、阻塞状态Blocked和死亡状态Terminat...原创 2018-04-23 12:29:23 · 2923 阅读 · 1 评论 -
Java前台线程与后台线程
Java前台线程与后台线程上一篇博客在main()方法中,创建并启动了四个新的线程后,main()方法中的代码执行完毕,此时,方法会结束,main线程也就随之结束了通过程序的运行结果可以看出,虽然,main线程结束了,但是整个Java程序却没有随之结束,仍然在执行售票的代码对于Java程序来说,只要还有一个前台线程在运行,这个进程就不会结束,如果一个进程中,只有后台线程在运行,这个进程...原创 2018-04-15 23:26:57 · 2891 阅读 · 0 评论 -
Java多线程两种实现方式的对比
Java多线程两种实现方式的对比 一种,直接继承Thread类 一种,实现Thread类的Runnable接口两种方式的区别比如,售票厅有四个窗口,可以发售某日某次列出的100张车票,此时,100张车票可以看作是共享资源,四个售票窗口需要创建四个线程 可以通过Thread的currentThread()方法,得到当前的线程的实例对象,然后,调用getName()方法,可以获取到线程的...原创 2018-04-15 23:20:26 · 2735 阅读 · 0 评论 -
Java实现Runnable接口创建多线程
Java实现Runnable接口创建多线程通过继承Thread类,实现多线程,但是,这种方式有一定的局限性,因为,Java中只支持单继承,一个类一旦继承了某个父类,就无法再继承Thread类 比如,学生类Student继承了Person类,就无法通过继承Thread类,创建线程针对这种情况,Thread类提供了另外一个构造方法Runnable target 其中,Runnable是一个...原创 2018-04-15 23:14:18 · 4306 阅读 · 0 评论 -
Java继承Thread类创建多线程
Java继承Thread类创建多线程单线程示例示例,Example01.javapublic class Example01{ public static void main(String[] args){ // 创建MyThread实例对象 // 调用MyThread类的run()方法在运行 // 该循环是一个死循环,打...原创 2018-04-15 23:10:26 · 2476 阅读 · 0 评论 -
Java实现多线程
Java实现多线程Java提供了两种多线程实现方式一种,继承java.lang包下的Thread类, 覆写Thread类的run()方法,在run()方法中实现运行在线程上的代码一种,实现java.lang.Runnable接口 同样,在run()方法中,实现运行在线程上的代码...原创 2018-04-15 22:57:06 · 227 阅读 · 0 评论 -
Java线程概述
日常生活中,很多事情都是同时进行 比如,我们可以同时进行呼吸、血液循环、思考问题等活动, 在使用计算机的过程中,应用程序也可以同时运行,用户可以使用计算机一边听歌,一边玩游戏 在应用程序中,不同的程序块,也是可以同时运行的,这种多个程序块同时运行的现象,被称为并发执行 多线程,是指一个应用程序中,有多条并发执行的线索,每条线索都被一个线程,它们会交替执行,彼此间可以进行通信进程在操...原创 2018-04-08 21:58:29 · 351 阅读 · 0 评论 -
Synchronize类锁
类锁Synchronize与static 在静态方法上,加上synchronize关键字 表示锁定class类,该锁是类级别的锁,独占类锁代码package com.bjsxt.base.sync002;/** * 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁, * 所以代码中哪个线程先执行synchronized关键字的方法,哪个线...原创 2018-08-09 10:37:32 · 607 阅读 · 0 评论 -
Synchronize对象锁
对象锁多个线程多个锁 多个线程,每个线程都可以拿到自己指定的锁 分别获得锁之后,执行synchronize方法体的内容Synchronize 取得的锁,都是对象锁 两个对象,线程获得的就是两个不同的锁 它们之间独立执行,互不影响代码package com.bjsxt.base.sync002;/** * 关键字synchronized取得的锁都是对象锁,而不是把...原创 2018-08-09 10:35:59 · 390 阅读 · 0 评论 -
Java线程的状态转换
Java线程,由运行状态转换成阻塞状态的原因,以及从阻塞状态转换成就绪状态1、当线程试图获取某个对象的同步锁时,如果,该锁被其他线程所持有,则当前线程会进入阻塞状态,如果,想从阻塞状态进入就绪状态,必须得获取到其他线程所持有的锁2、当线程调用了一个阻塞式的IO方法时,该线程就会进入阻塞状态,如果,向进入就绪状态,就必须要等到这个阻塞的IO方法返回3、当线程调用了某个对象的wait()方...原创 2018-04-23 12:30:50 · 339 阅读 · 0 评论 -
Java线程的死锁
两个线程,在运行时都在等待对方的锁 这样,便造成了程序的停滞,这种现象称为死锁 示例,Example14.java 代码如下class DeadLockThread implements Runnable{ static Object chopsticks=new Object(); // 定义Object类型的chopsticks锁对象 static Ob...原创 2018-05-13 23:54:16 · 1056 阅读 · 0 评论 -
Java线程的调度
程序中的多个线程,是并发执行的 某个线程如果想要被执行,必须得到CPU的使用权Java虚拟机,会按照特定的机制为程序中的,每个线程分配CPU的使用权,这种机制称为线程的调度计算机中,线程的调度有两种模型 分别是分时调度模型和抢占式调度模型分时调度模型是指让所有的线程,轮流获得CPU的使用权,并且,平均分配每个线程占用的CPU的时间片抢占式调度模型是指让可运行池中,优...原创 2018-05-27 23:08:10 · 376 阅读 · 0 评论 -
Synchronize异常释放锁
Synchronize异常释放锁遇到异常的时候,就会释放锁 对象锁,并不会影响后续队列任务的执行处理队列Synchronize处理一个队列,多个任务任务独立 任务之间不会相互影响,此时,可以遇到异常 记录日志,然后,继续执行后续的任务 最后,等所有的任务都执行完毕,再根据日志处理,发生异常的任务任务整体 任务之间存在关联关系,所有的任务是一个整体 某一个任务执行...原创 2018-08-23 10:02:42 · 2757 阅读 · 0 评论 -
Synchronize锁继承
Synchronize锁继承如果,父类使用synchronize修饰 子类,也使用synchronize修改 此时,线程是安全的package com.bjsxt.base.sync005;/** * synchronized的重入 * */public class SyncDubbo2 { static class Main { public...原创 2018-08-23 09:58:25 · 508 阅读 · 0 评论 -
Synchronize锁重入
Synchronize锁重入拥有锁重入的功能 就是在使用synchronize时,当一个线程得到了一个对象的锁之后 再次,请求该对象时,可以再次得到该对象的锁package com.bjsxt.base.sync005;/** * synchronized的重入 * */public class SyncDubbo1 { public synchronized vo...原创 2018-08-23 09:57:14 · 1116 阅读 · 0 评论