`

Jav并发

    博客分类:
  • Java
阅读更多

Java 阻塞队列

 

      ArrayBlockingQueue 

      LinkedBlockingQueue 

      SynchronousQueue 

用put() 和 take() 是阻塞
不要用poll()和offer() ,要用也要用带时间参数的 

锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如 ReadWriteLock 的读取锁。

synchronized 每个对象相关的隐式监视器锁的访问,强制所有锁获取和释放均要出现在一个块结构中:当获取了多个锁时,它们必须以相反的顺序释放,且必须在与所有锁被获取时相同的词法范围内释放所有锁。
Lock

Lock 实现提供了使用 synchronized 方法和语句所没有的其他功能,包括提供了一个非块结构的获取锁尝试 (tryLock())、一个获取可中断锁的尝试 (lockInterruptibly()) 和一个获取超时失效锁的尝试 (tryLock(long, TimeUnit))。

Lock 类还可以提供与隐式监视器锁完全不同的行为和语义,如保证排序、非重入用法或死锁检测。如果某个实现提供了这样特殊的语义,则该实现必须对这些语义加以记录。 

 

ReentrantLock
一个可重入的互斥锁 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。

Condition

ConditionObject 监视器方法(waitnotifynotifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。

使用Atomic 包
使用阻塞队列

lock-free 算法
1 循环 ( for (;;))
2 CAS  compareandset  Compareand-Swap
原子操作指一个cpu时钟周期内就可以完成的操作,不会被其他线程干扰。
         {if( *pVal == oldVal )  { *pVal = newVal; return true;} return false;}
3 回退

1 使用CAS结构的数据结构,避免使用锁,如AtomicXXX、ConcurrentMap、CopyOnWriteList、ConcurrentLinkedQueue
2 注意锁的顺序
3, 通过dump kill -3 等查看死锁信息
4 注意外部锁,比如数据库的锁 文件的锁
Map 用ConcurentHashMap 取代
避免直接使用锁,锁由数据结构管理

ScheduledExecutorService,不建议你再使用java.util.Timer

Amdahl 定律 
    – Gene Amdahl 发现在计算机体系架构设计过程中,即使你有10个老婆,也不能 
      某个部件的优化对整个架构的优化和改善是有                    一个月把孩子生下来。 
      上限的。这个发现后来成为知名的Amdahl 定律。 

•Gustafson 定律 
    – Gustafson假设随着处理器个数的增加,并行与               当你有10个老婆,就会要生 
       串行的计算总量也是可以增加的。Gustafson定 
      律认为加速系数几乎跟处理器个数成正比,如                    更多的孩子。 
      果现实情况符合Gustafson定律的假设前提的话, 
      那么软件的性能将可以随着处理个数的增加而 
      增加。 

•Sun-Ni 定律 
    – 充分利用存储空间等计算资源,尽量增大问题                    你要设法让每个老婆都在干 
      规模以产生更好/更精确的解。                          活,别让她们闲着。 



CountDownLatch
当你启动很多线程,你需要这些线程等到通知后真正开始,用countdownlatch
 当你启动了一个线程,你需要等它执行结束, 此时,CountDownLatch也许是一个很好的选择。 

CAS注

CAS在我的理解就是下面这段代码


{if( *pVal == oldVal )  { *pVal = newVal; return true;} return false;}

当然,CAS把这段代码做成了一个原子操作。

很多人看到这里,并不是十分理解,这个原子操作怎么去实现LOCK FREE。

一般CAS会封装成下面的形式

    bool cas32( int * pVal, int oldVal, int newVal );

pVal 表示要比较和替换数值的地址,oldVal表示期望的值,newVal表示希望替换成的值。在多线程中使用时,一般是下面这样。

    volitale int myValue;
    ......

    while( !cas32( &myValue, myValue, myValue+1 ) ) {
        ....
    }

这是什么意思呢?
我们知道,在多线程里面,如果多个线程同时在写一个变量,并且不进行同步的时候,这个变量的值就会不准确。比如两个线程同时在对一个变量进行+1操作的时候,他们分别需要进行三个操作,读入变量值(到寄存器),值+1,写入变量值(到变量内存地址)。这三个操作是无法保证原子性的,也就无法保证变量在读入,+1后,原变量没有被别的线程修改。
cas在这里做的实际上就是在变量没有被其他线程修改,或者被修改但是又恢复到我们期望读入的值的时候,修改变量的值。这句话很拗口,其实看CAS的参数就很容易理解,pVal传递进去的是变量的地址,cas通过这个来读取变量真实的值,oldVal传递的是变量在函数调用时的值,用来跟真实值进行比较,而newVal传递进去的是期望变量赋予的新的值。根据上面的cas的代码含义我们知道,当变量真实值不等于调用时的值的时候,是不会赋予变量新的值的。所以我们使用了一个WHILE来等待这个赋值成立。同时我们给与myValue一个volitale修饰,用意是让while中调用cas函数时,读取myValue的当前值,而不是寄存器中保存的值,以免变量值的“过期”,从而让这个cas可以在没有其他线程来修改myValue的时候执行成功,从而实现lock free的修改myValu
  
分享到:
评论

相关推荐

    jav.rar_JAV301_JAV388_JAV第8页_jav674_javclass.com

    第15章可能涉及的话题有IO流、网络编程,而第17章可能涵盖了反射、注解或Java的高级特性如并发编程。 在学习这些章节时,学生应该首先理解每章的基础概念,然后通过阅读和分析提供的代码来加深理解,最后尝试自己...

    DHS.rar_DVD18JAV_JAV505_jav137_jav2018dvd_jav649

    Java集合框架(如ArrayList、HashMap)的使用,线程并发编程,以及如何利用设计模式(如工厂模式、单例模式)来提高代码复用性和可维护性,都是Java开发者必备的知识。 如果项目涉及到数据库交互,那么Java的JDBC...

    JAV.rar_site:www.pudn.com_www.118jav_www.jav 118.com_www.jav123_

    2. 并发处理:通过线程池管理并发请求,提高系统吞吐量,确保服务稳定。 3. 扩展性设计:为应对未来需求变化,系统应具备良好的模块化和解耦特性,方便功能扩展和升级。 六、部署与维护 1. 系统部署:可选择单机...

    62-Java并发编程实战

    Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Jav

    jav_.rar_JAV_jav database_javdatabase_连接池

    这样可以减少数据库连接的创建和销毁带来的开销,提高系统的响应速度和并发处理能力。 在描述中提到的`database.java`,可能是一个自定义的Java类,实现了连接池的功能。这个类通常会包含以下关键组件: 1. **连接...

    jav.rar_JAV

    "jav.rar_JAV"这个压缩包文件,很显然是与Java学习相关的资源集合,对初学者尤其有帮助。 【Java电子教案】 电子教案通常包含了详细的课程介绍、概念解释、实例演示和习题解答,是学习Java编程的重要辅助材料。这...

    cp.zip_126039cp.com_WWW,cp9556,com_cp66558.com_javbus.com[/cp]_p

    4. **并发处理**:由于涉及多人同时购买彩票,系统需要处理高并发情况,保证数据一致性。 5. **支付集成**:可能与第三方支付平台(如支付宝、微信支付)集成,实现在线支付功能。 6. **通知机制**:当有新的彩票...

    聊天系统jav a

    3. **多用户并发处理**:聊天系统需要支持多个用户同时在线交谈,这需要服务器能够处理并发请求。Java的线程模型和并发库可以有效地管理多个用户连接。 4. **聊天室或一对一聊天**:系统可能包含公共聊天室供用户...

    聊聊并发(3)Java线程池的分析和使用Java开发Jav

    这样可以避免频繁地创建和销毁线程带来的性能损失,同时也能更好地控制系统的并发程度。 Java通过`java.util.concurrent`包中的`ExecutorService`接口和`ThreadPoolExecutor`类实现了线程池。`ExecutorService`是...

    jav API中文文档I

    以上只是Java API中的一小部分知识点,实际上Java API涵盖了更多主题,如并发控制、XML处理、数据库连接、日期时间处理等。通过深入学习和熟练使用Java API,开发者可以构建出高效、可靠的Java应用程序。

    API.rar_Chinese jav_Javaapi _chinesejav_jav chinese_javaAPI中文文档

    `Thread`类代表了程序中的一个执行线程,而`java.util.concurrent`提供了并发工具类,如`ExecutorService`和`Future`,便于管理线程池和异步任务。 5. **网络编程**:`java.net`包包含了处理网络连接的类,如`...

    jav经典小程序,五子棋,聊天程序,扫雷程序

    【标题】中的“jav经典小程序,五子棋,聊天程序,扫雷程序”指的是使用Java编程语言编写的一些经典的小型应用程序。这些程序包括了大家熟知的娱乐游戏——五子棋,一个实现基本通信功能的聊天程序,以及模拟经典...

    用jav a编写的学籍管理系统

    8. **多线程**:如果系统涉及并发处理,比如同时处理多个学生的数据,可能会用到Thread类或Runnable接口实现多线程。 9. **设计模式**:虽然作为初学者的练习项目,但可能涉及一些基本的设计模式,如单例模式(用于...

    100 Recipes for Programming Jav - Jamie Munro

    - **解释**: 详细说明了如何使用Java代码创建SOAP请求消息,并发送给Web服务端。这通常涉及到构建SOAP消息体、设置HTTP头部信息等步骤。 ##### 食谱13: 生成随机字母数字字符串 - **知识点**: 随机数生成、字符串...

    jav考试系统

    9. **可扩展性**:随着用户数量的增长,系统应能处理高并发请求,并且具备良好的扩展性,以适应未来的功能升级和性能优化。 10. **用户反馈与支持**:系统应包含帮助文档和在线客服功能,方便用户解决问题和提供...

    Java_neural-network_toolkit.rar_Network.JAV_NetworkjAVcom_jav.nn

    这个工具包,名为"Network.JAV_NetworkjAVcom_jav.nn",提供了在Java环境中搭建和操作神经网络所需的各种功能。从给定的标签来看,我们可以推测这个库支持Java 1.2或更高版本,并且专注于神经网络的实现。 神经网络...

    Java高并发秒杀API之业务分析与DAO层 第一课代码

    在本课程中,我们将深入探讨Java高并发秒杀API的设计与实现,重点在于业务分析以及DAO(Data Access Object)层的构建。秒杀系统在电商、票务等场景中广泛应用,其核心挑战在于如何处理短时间内大量用户同时请求的高...

    JAV A 简单服务器 和客户端

    这样,服务器可以同时处理多个并发的客户端连接。 **总结** "JAV A 简单服务器 和客户端"项目提供了一个基础的网络通信模型,展示了如何使用Java实现服务器和客户端的交互。通过这个项目,我们可以学习到Java中的...

    UDP调试工具 DELPHI AND JAV A

    4. 并发处理:在多线程环境中,确保对共享资源(如接收缓冲区)进行适当的同步。 总结来说,Delphi和Java都提供了方便的API来实现UDP通信。理解UDP的工作原理并掌握如何在这些语言中编写UDP客户端和服务器是网络...

    JAVA知识图谱:JVM、JMM、JUC、NIO、Netty、IOC、AOP、Jav-JavaKnowledge.zip

    这个"JAVA知识图谱"涵盖了Java开发中的核心概念和技术,包括JVM(Java虚拟机)、JMM(Java内存模型)、JUC(Java并发工具包)、NIO(非阻塞I/O)、Netty(高性能网络应用框架)、IOC( inversion of control,控制...

Global site tag (gtag.js) - Google Analytics