Java高并发
偶像来了
这个作者很懒,什么都没留下…
展开
-
(17)提高“锁”性能
文章目录减小锁持有时间减小锁粒度读写分离锁来替换独占锁 减小锁持有时间 只在必须同步的数据处进行同步。尤其不需要同步的重量级方法,不要放入同步块中。 注意:减小锁的持有时间有助于降低锁冲突的可能性,进而提升系统的并发能力。 减小锁粒度 所谓减少锁粒度,就是指缩小锁定对象的范围,从而减少锁冲突的可能性,进而提高系统的并发能力。 读写分离锁来替换独占锁 读写锁是对系统功能点的分割。 在读多写少的场...原创 2019-05-30 14:09:20 · 101 阅读 · 0 评论 -
(18)Java虚拟机对锁优化
文章目录锁偏向轻量级锁自旋锁锁清除 锁偏向 如果一个线程获得了锁,那么锁就进入偏向模式。 轻量级锁 如果偏向锁失败,虚拟机并不会立即挂起线程。线程会获得轻量级锁,如果成功,顺利进入临界区。失败的话,锁进行膨胀为重量级锁。 自旋锁 锁膨胀后,虚拟机为了避免线程真实地在操作系统层面挂起,虚拟机还会做最后的努力-----自旋锁。虚拟机会让当前线程做几个空循环,在经过若干次循环后,如果可以得到锁,那么就顺...原创 2019-05-30 15:05:01 · 126 阅读 · 0 评论 -
(10)CPU及volatile
文章目录CPU并发编程的三个重要特性 CPU 所有的运算操作都是由 CPU 的寄存器来完成的。 CPU cache模型: CPU 通过 cache 与主内存进行交互 CPU缓存一致性问题: 通过总线加锁的方式。存在于早起CPU中,一种悲观方式,效率低下。 通过缓存一致性协议。将其他缓存设置为无状态,只能从主内存中读取。 并发编程的三个重要特性 原子性 指在一次的操作或者多次操作中,要么所...原创 2019-05-28 14:06:45 · 125 阅读 · 0 评论 -
(19)无锁
无锁通过比较交换(CAS)来保证线程安全。 AtomicInteger 方法 public final int get() //取得当前值 public final void set(int newValue) //设置当前值 public final int getAndSet(int ne...原创 2019-06-05 17:31:33 · 99 阅读 · 0 评论 -
(11)重入锁
重入锁使用的是 ReentrantLock 类。 文章目录说明中断锁申请等待限时公平锁方法Condition 说明 重入锁代码 ReentrantLock lock = new ReentrantLock(); lock.lock(); //其他代码 lock.unlock(); 在退出临界区的时候,必须释放锁,否则,其他线程就没有机会再访问临界区了。在同一个线程中,重入锁可以反复进入,一个...原创 2019-05-28 17:37:05 · 93 阅读 · 0 评论 -
(12)信号量和读写锁
文章目录信号量读写锁 信号量 信号量可以指定多个线程,同时访问某一个资源。 构造函数 // permits 为允许的个数 public Semaphore(int permits) public Semaphore(int permits, boolean fair)//第二个参数指定是否公平 方法 //尝试获得一个准许 public void acquire() //该方法不响应中断 publ...原创 2019-05-29 11:29:50 · 218 阅读 · 0 评论 -
(13)倒计时器和循环栅栏
文章目录倒计时器循环栅栏 倒计时器 允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。 一个 CountDownLatch 用给定的计数初始化。await() 方法阻塞,直到由于countDown() 方法的调用而导致当前计数达到零,之后所有等待线程被释放,并且任何后续的 await() 调用立即返回。 这是一个一次性的现象 - 计数无法重置。 构造函数 该类只有一个构造函数 p...原创 2019-05-29 15:11:41 · 397 阅读 · 0 评论 -
(14)并发集合
ConcurrentHashMap 一个高效的并发 HashMap,并且是线程安全的。 CopyOnWriteArrayList 一个 List,和 ArrayList 是一族的,在读多写少的场合,该 List 的性能非常好,远远好于 Vector。 ConcurrentLinkedQueue 高效的并发队列,使用链表实现,可看作一个线程安全的 LinkedList。 Concurre...原创 2019-05-29 16:44:37 · 158 阅读 · 0 评论 -
(16)线程安全的List
文章目录SynchronizedList SynchronizedList 该类为 Collections 的内部类,只能通过 Collections.synchronizedList() 方法生成。该方法的参数为一个 List 内部的所有方法都是调用该参数的方法,只是增加了对象锁,对象锁为Collections 对象 。 该包装 List在多线程环境中,性能表现的不太好。如果并发级别不高,也够用...原创 2019-05-30 10:33:42 · 130 阅读 · 0 评论 -
(9)JVM类加载器
文章目录JVM内置三大类加载器自定义类加载器 JVM内置三大类加载器 类加载器父委托机制 1.根类加载器 根加载器又称为 Bootstrap 类加载器。该加载器是最为顶层的加载器,没有任何父加载器。主要负责虚拟机核心类库的加载,比如整个 java.lang 包。 2.扩展类加载器 扩展类加载器的父加载器是根加载器,主要用于加载 JAVA_HOME 下的 jre\lb\ext 子目录里面的类库。...原创 2019-05-27 14:28:33 · 94 阅读 · 0 评论 -
(6)Hook线程及捕获线程执行异常
文章目录Hook线程线程运行时异常 Hook线程 JVM 进程退出是由于 JVM 进程中没有活跃的非守护线程,或者收到了系统中断信号,向 JVM 程序注入一个 Hook 线程,在 JVM 进程退出的时候, Hook 线程会启动执行,通过 Runtime 可以为 JVM 注入多个 Hook 线程。 示例 public static void main(String[] args) { ...原创 2019-05-22 14:37:55 · 180 阅读 · 0 评论 -
(3)线程API
目录1.sleep2.yield 1.sleep 该方法为静态方法,一个需要传入毫秒数,另外一个传入毫秒和纳秒数。 sleep 方法会使当前线程进入指定时间休眠,但是休眠期间,不会释放 monitor 锁的所有权。 可使用 TimeUnit 替代 Thread.sleep。 2.yield ...原创 2019-05-20 16:29:42 · 211 阅读 · 0 评论 -
(7)线程池
文章目录Executors Executors Executors 为工厂方法,方法如下: //一个可缓存线程池 public static ExecutorService newCachedThreadPool(); public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory); //一个固定线程数...原创 2019-05-24 14:12:32 · 100 阅读 · 0 评论 -
(4)线程安全与数据同步
共享资源:指的是多个线程同时对同一份资源进行访问,被多个线程访问的资源就称为共享资源。 文章目录synchronized synchronized synchronized 关键字提供了一种锁的机制,能够确保共享变量的互斥访问,从而防止数据不一致问题的出现。 synchronized 关键字包括 monitor enter 和 monitor exit 两个 JVM 指令,它能够保证在任何时...原创 2019-05-21 10:30:15 · 228 阅读 · 0 评论 -
(8)类的加载过程
文章目录类的加载过程简介类的主动使用和被动使用 类的加载过程简介 类的加载过程一般分为三个阶段,分别是 加载阶段、连接阶段 和 初始化阶段。如下图: 加载阶段:主要负责查找并且加载类的二进制数据文件,其实就是 class 文件。 连接阶段:细分如下三个阶段。 验证:主要是确保类文件的正确性,比如 class 的版本,class 文件的魔术因子是否正确等。 准备:把类的静态变量分配内存,并且为...原创 2019-05-24 16:57:12 · 118 阅读 · 0 评论 -
(1)线程的生命周期
线程生命周期的5个阶段: NEW RUNNABLE RUNNING BLOCKED TERMINATED NEW 用 new 创建一个线程,并不在执行状态,因为没有调用 start 方法启动线程,该线程的状态为 NEW 状态。 NEW 状态通过 start 方法进入 RUNNABLE 状态。 RUNNABLE 调用 start 方法,线程进入 RUNNABLE 状态。此时在 JVM 中创建...原创 2019-05-16 10:30:51 · 139 阅读 · 0 评论 -
(5)线程间通信
文章目录同步阻塞和异步非阻塞wait 和 notifywait 和 sleep 同步阻塞和异步非阻塞 同步阻塞 会造成等待时间长、系统吞吐量不高、线程频繁的创建开启与销毁、导致CPU频繁切换,降低系统性能。 异步非阻塞 客户端不用等待结果才返回、提高了系统的吞吐量和并发量、线程重复利用。 wait 和 notify wait wait 方法会使当前线程阻塞。 wait 方法必须拥有该对象的 ...原创 2019-05-21 15:50:36 · 102 阅读 · 0 评论 -
(2)守护线程
目录JVM程序退出守护线程线程的父子关系JVM虚拟机 JVM程序退出 当只有守护线程运行的时候,JVM的进程会退出。即使有一个非守护线程在运行,JVM程序也会在运行。 守护线程 守护线程为在后台默默执行的线程。 线程是否为守护线程和它的父线程有很大的关系,如果父线程是正常线程,则子线程也是正常线程,反之亦然。 可通过 setDaemon 方法设置为守护线程,该方法只在线程启动之前才能生效。 线程的...原创 2019-05-16 17:14:04 · 94 阅读 · 0 评论 -
(15)线程安全的HashMap
文章目录SynchronizedMap SynchronizedMap 该类为 Collections 的内部类,只能通过 Collections.synchronizedMap() 方法生成。该方法的参数为一个 Map 内部的所有方法都是调用该参数的方法,只是增加了对象锁,对象锁为本对象,即 SynchronizedMap 。 该包装 Map 在多线程环境中,性能表现的不太好。如果并发级别不高,...原创 2019-05-29 17:33:44 · 116 阅读 · 0 评论