美文网首页写作与程序
java初入多线程14

java初入多线程14

作者: 胖琪的升级之路 | 来源:发表于2017-10-24 09:41 被阅读5次

接下来几章说的是锁的优化和注意事项问题。

减小锁持有的时间

  • 对于在方法执行的过程中有的步骤不需要进行同步,那么就在只需要进行同步的程序中进行加锁。不需要的方法 就不再加锁。

减小锁粒度

  • ConcurrentHashMap: 内部进一步的分成若干个 HashMap 。 我们称之为 SEGMENT. 默认情况下 细分为16个段。在进行put()操作之前,该HashMap 总是先得到 段 ,然后在执行put() 操作。
  • 但是如果我们需要获得全局锁时,消耗的资源就很多。 比如需要操作的是size方法 。在这个Map中首先会尝试使用无锁的方式来求和,失败之后才会尝试这种加锁的方式。
  • 总的来说减少所粒度,就是减少锁定对象的范围。 较少所冲突的可能性,进而提高系统的并发能力。

读写分离代替独占锁

锁分离 : 具体可以看LindedBlockingQueue 代码实现

锁粗化 : 对一系列的操作需要锁的 ,可以减少锁的同步次数。这就是粗化。

锁偏向

  • 一个线程获得了锁,那么锁就进入了锁偏向模式。当这个线程再次请求锁的时候就无需再进行同步操作。 使用Java 虚拟机参数-XX: +UseBiasedLocking 开启偏向锁。

轻量级锁

  • 如果偏向锁 失败,虚拟机 并不会立即挂起线程。会使用一种优化操作。只是简单的将对象头部作为指针,指向持有锁的线程堆栈的内部,来判断一个线程是否持有对象锁。成功进入临界区,失败的话很容易膨胀成重量锁。

自旋锁

  • 锁膨胀后,为了避免在操作系统上挂起,虚拟机还会做最后的努力--自旋锁。进行循环 再去尝试获得锁,如果经过若干次尝试之后还是失败,那么就会在系统上挂起线程。

锁清除

  • 锁清除是一种更彻底的锁优化。 通过上下文对不可能存在共享资源竞争的锁进行清除。减少毫无意义的请求锁的时间。

ThreadLocal

  • 一个局部的线程变量。 只有当前线程可以访问。

CAS 比较交换

  • CAS 包含三个参数, V 表示要更新的变量, E 表示预期值,N表示新值。 只有当V==E 时 才将V的值 设置为N . 如果V值 和E值不同,代表有其他线程已经操作过该值。则当前线程不操作,直接返回真实值即可。

相关文章

  • java初入多线程14

    接下来几章说的是锁的优化和注意事项问题。 减小锁持有的时间 对于在方法执行的过程中有的步骤不需要进行同步,那么就在...

  • java初入多线程4

    线程中断 概念 :让目标线程停止执行,但是是高知目标线程希望线退出,具体退出由目标线程自己决定。 相关的方法,暂时...

  • java初入多线程17

    使用Disruptor 实现消费者和生产者 我们在主方法操作中将缓冲区设置成1024 , 在这里有四个消费者, 有...

  • java初入多线程11

    核心线程池的内部实现机制。 阿里巴巴 code检验推荐自己实现线程池的创建。不是使用Executors的创建方法。...

  • java初入多线程12

    自定义线程创建:ThreadFactory 我们原先用的线程池ThreadPoolExecutor 里面的线程都...

  • java初入多线程10

    线程阻塞工具类 :LockSupport LockSupport 是一个非常实用的线程阻塞工具, 可以在线程内任意...

  • java初入多线程7

    同步控制 synchronized 扩展:重入锁 重入锁来代替synchronized,在Jdk1.6以后 syn...

  • java初入多线程15

    无锁的线程安全整数: AtomicInteger 方法介绍public final int get(); 取得当前...

  • java初入多线程13

    并发集合简介 ConcurrentHashMap : 线程安全的HashMap; CopyOnWriteArray...

  • java初入多线程16

    并行模式与算法 单例模式 : 保证在系统中只生产一个实例。下面是几种单例模式。 这个容易出现的问题就是单例什么时候...

网友评论

    本文标题:java初入多线程14

    本文链接:https://www.haomeiwen.com/subject/inqauxtx.html