`

Java多线程设计的并发控制

    博客分类:
  • Java
阅读更多

并发级别:
    阻塞:悲观控制策略,试图进入临界区前,获取锁,得不到,线程挂起。
    无饥饿:锁是公平的,满足先来后到,进行排队。
    无障碍:乐观控制策略,线程在操作前,先读取并保存一个“一致性标记”,在操作完成后,再次读取,检查这个标记是否被更改过,如果两者一致,说明资源没有冲突,如果不一致,说明资源可能在操作过程与其他写线程冲突,需要重试操作,而任何对资源有修改操作的线程,在修改数据前,都需要更新这个一致标记,表示数据不再安全。 
    无锁:无锁的并行都是无障碍的,在无锁的情况下,所有的线程都能尝试对临界区进行访问,但不同的是,无锁的并发保证必然有一个线程能够在有限步内完成操作离开临界区。在无锁的调用中,一个典型的特点是可能会包含一个无穷循环,在循环中,线程会不断尝试修改共享变量,如果没有冲突,修改成功,退出,否则继续尝试修改。while(!atomicVar.compareAndSet(localVar, localVar+1)){localVar = atomicVar.get();} 
    无等待:一个典型的无等待就是RCU,对数据的读可以不加控制,因此所有的读线程都是无等待的,不会被锁定,也不会引起任何冲突,在写数据的时候,先取得原始数据的副本,接着只修改副本数据,修改完成后,在合适的时机回写数据。 
    JAVA内存模型(JMM)围绕着并发编程中的原子性,内存可见性,有序性建立,定义了程序中变量访问的规则。volatile保证变量值修改后的新值立刻同步到主存,每次使用变量前立即从主存中刷新,从而保证了线程间volatile变量的内存可见性。synchronized、Lock、final也可以保证内存可见性。
1,synchronized 
    指定加锁对象:对给定对象加锁,进入同步代码前工获取给定对象的锁 
     直接作用于实例方法:对当前实例对象加锁 
     直接作用于静态方法:对当前类加锁 
     可重入,不可中断,非公平
2,重入锁(ReentrantLock) 
     可重入,可中断,可超时等待,可无等待,可实现公平、非公平的锁 
     重要方法: 
     lock(),lockInterruptibly(),tryLock(),tryLock(long time, TimeUnit unit),unlock()
3,条件变量 
     通过Lock接口的newCondition方法生成一个与当前重入锁绑定的Condition实例。 
     重要方法: 
     void await(),void awatUninterruptibly(),long awatiNanos(long nanosTimeout), 
     boolean awati(long time, TimeUnit unit), void signal(),void signalAll()
4,信号量 
     允许多线程获得访问许可。 
     public Semaphore(int permits) 
     public Semaphore(int permits, boolean fair) 
     public void acquire() 
     public void acquireUninterruptibly() 
     public void tryAcquire() 
     public void tryAcquire(long time, TimeUnit unit) 
     public void release()
5,读写锁 
     ReentrantReadWriteLock rwLock = new  ReentrantReadWriteLock(); 
     Lock rlock = rwLock.readLock(); 
     Lock wlock = rwLock.writeLock(); 

6,原子类

    AtomicInteger、AtomicLong、AtomicBoolean、AtomicReference、AtomicStampedReference、AtomicIntegerArray、AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater
7,锁优化

    减少锁持有时间,减少锁粒度,读写分离锁替换独占锁,锁分离,锁粗化。

    Java虚拟机对锁优化策略:

    锁偏向:对加锁操作的优化,如果一个线程获得了锁,那么锁就进入偏向模式,当这个线程再次请求锁时,无须做任何同步操作,对于没有锁竞争的场合,偏向锁有比较好的优化效果;锁竞争比较激烈的场合,最有可能的是每次不同的线程请求相同的锁,偏向模式失效。使用-XX:+UseBiasedLocking开启

    轻量级锁:在偏向锁失败时,虚拟机使用轻量级锁优化,它只是简单将对象头部作为指针,指向持有锁的线程堆栈的内部,来判断一个线程是否持有对象锁,轻量级锁失败,升级为重量级锁。

    自旋锁:虚拟机为避免线程真实地在操作系统层面挂起,让当前线程做几个空循环,在经过若干次循环后,如果得到锁,进入临界区,失败,线程挂起。

    锁清除:在JIT编译时,对运行上下文的扫描,通过逃逸分析技术,观察某个变量是否会逃出一个作用域,去除不可能存在共享资源竞争的锁。-XX:+DoEscapeAnalysis打开逃逸分析,-XX:+EliminateLocks打开锁清除。

   

分享到:
评论

相关推荐

    java 多线程并发实例

    在Java编程中,多线程并发是...总之,Java的多线程并发实例可以帮助我们更好地理解和实践线程控制、同步机制以及经典的设计模式,提升我们的编程能力。通过不断学习和实践,我们可以编写出高效、安全的多线程并发程序。

    Java 模拟线程并发

    最后,Java并发库还包含了很多其他有用的工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如...

    Java多线程与并发库高级应用

    并发库高级应用\多线程\Java

    java多线程并发控制[参照].pdf

    java多线程并发控制[参照].pdf

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    java多线程和并发.pdf

    Java多线程与并发编程是Java语言中用于处理多任务执行的关键技术,它能够帮助开发者设计出能够有效应对高并发请求的应用程序。在现代的线上(Online)和离线(Offline)应用中,合理利用多线程技术可以大幅提高系统...

    java多线程并发

    java多线程并发的在新窗口

    java socket 多线程并发控制 hibernate mysql

    本项目聚焦于使用Java的Socket进行多线程并发控制,并结合Hibernate ORM框架与MySQL数据库进行数据存储。下面将详细阐述这些技术及其应用。 首先,Java Socket是Java提供的用于实现网络上不同计算机间进程通信的...

    java 多线程高并发相关资料收集

    本文将围绕“Java多线程高并发相关资料收集”这一主题,详细探讨这两个领域的核心知识点。 首先,多线程是指在单个程序中同时执行多个线程。Java提供了一个强大的多线程支持,允许开发者创建、管理和控制多个执行...

    笔记_张孝祥_Java多线程与并发库高级应用

    张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。

    java多线程设计模式详解(PDF及源码)

    (注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...

    java多线程与高并发视频

    java多线程与高并发java多线程与高并发java多线程与高并发

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...

    Java多线程设计模式_清晰完整PDF版 Java多线程设计模式源代码

    Java多线程设计模式是Java开发中的重要领域,它涉及到如何在并发环境下高效、安全地管理资源和控制程序执行流程。本资料集包含了清晰完整的PDF版书籍和源代码,为学习和理解Java多线程设计模式提供了丰富的素材。 ...

    java多线程设计

    总结,Java多线程设计是构建高性能、高并发应用的基础。通过理解并合理使用不可变对象,我们可以有效预防多线程环境中的非安全问题,确保程序的稳定性和正确性。在实际开发中,结合各种线程同步机制和并发工具,可以...

    JAVA多线程并发编程

    但同时,多线程并发也会引入一些问题,如数据竞争和同步问题。 为了解决这些问题,Java提供了多种同步机制。`synchronized`关键字用于控制对共享资源的访问,确保同一时间只有一个线程可以执行特定代码块,从而避免...

    Java入门到精通视频教程.课件.代码,30套Java开发项目代码,Java多线程与并发库高级应用视频教程,及电子书

    黑马+传智 Java入门到精通视频教程+课件+代码,30套Java开发项目代码,Java多线程与并发库高级应用视频教程,及电子书,面试题,开发工具等

    java多线程查询数据库

    综上所述,"java多线程查询数据库"是一个涉及多线程技术、线程池管理、并发控制、分页查询等多个方面的复杂问题。通过理解和掌握这些知识点,我们可以有效地提高数据库操作的效率和系统的响应速度。

    Java 多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中不可或缺的一部分,它涉及到如何高效地利用CPU资源,实现并发执行多个任务。在操作系统层面,多线程是为了提高系统利用率,使得多个任务能够"同时"执行,但实际上,由于CPU的时钟...

Global site tag (gtag.js) - Google Analytics