`

并发库学习笔记四

 
阅读更多

ConcurrentHashMap并没有实现Lock-Free,只是使用了分离锁的办法使得能够支持多个writer开发,但是他需要更多的内存同样的思路用于更新数据库----乐观锁

publicclassSequenceDao{

publicbooleancompareAndSet(Stringname,intvalue,intexpect){

Map<String,Object>parameters=newHashMap<String,Object>();

parameters.put("name",name);

parameters.put("value",value);

parameters.put("expect",expect);

intupdateCount=getSqlMapClientTemplate().update("seauence.compareAndSet",parameters);

returnupdateCount==1;

}

}

publicclassSequenceService{

@Transactional(propagation=propagation.NOT_SUPPORTED)

publicsynchronizedvoidintcrement(StringsequenceName){

for(;;){

intvalue=dao.getValue(sequenceName);

if(dao.compareAndSet(sequenceName,value+1,value)){

break;

}

}

}

}

使用悲观锁版本

publicclassSepuenceService{

SequenceDaodao=newSequenceDao();

@Transactional(propagation=Propagation.REQUIRED)

publicsynchronizedvoidincrement(StringsequenceName){

intvalue=dao.getValueForUpdate(sequenceName);

dao.set(sequenceName,value+1);

}

}

publicclassSepuenceService{

SequenceDaodao=newSequenceDao();

@Transactional(propagation=Propagation.REQUIRED)

publicsynchronizedvoidincrement(StringsequenceName){

intvalue=dao.getValueForUpdate(sequenceName);

dao.set(sequenceName,value+1);

}

}

注:lock-free算法可以说是乐观锁,如果非激烈竟争的时候,不公使用锁

CopyOnWriteArrayList

publicclassEngLine{

privateList<Listener>listeners=newArrayList<Listener>();

publicbooleanaddListener(Listenerlistener){

synchronized(listener){

returnlisteners.add(listener);

}

}

publicvoiddoxxx(){

synchronized(listeners){

for(Listenerlistener:listeners){

listener.hashCode();

}

}

}

}

publicclassEngLine2{

//能够提高读操作时的效率

privateList<Listener>listeners=newCopyOnWriteArrayList<Listener>();

publicbooleanaddListener(Listenerlistener){

synchronized(listener){

returnlisteners.add(listener);

}

}

publicvoiddoxxx(){

synchronized(listeners){

for(Listenerlistener:listeners){

listener.hashCode();

}

}

}

}

锁的使用

1使用支持CAS的数据结构,如:

ActionXXXConcurrentMapCopyOnWriteListConcurretLinkedQueue

2一定要使用锁的时候,注意锁的顺序,相反顺序获得锁,就容易产生死锁

3死锁经常是无法避免的,鸵鸟策略很多基础框架都采用

4通过Dump线程的StackTrace,例如linux下执行kill-3<pid>

或者jstack-l<pid>

或者使用jconsole连接上去查看线程的StackTrace

5外部锁常被忽视,例如数据库的锁

分享到:
评论

相关推荐

    java并发库学习笔记

    java并发库学习笔记

    TBB并发容器 学习笔记

    TBB 并发容器 concurrent_queue concurrent_vector concurrent_hash_map TBB 并发容器 concurrent_queue concurrent_vector concurrent_hash_map TBB 并发容器 concurrent_queue concurrent_vector concurrent_hash_...

    多线程及java5的线程并发库学习笔记:带PDF下载

    NULL 博文链接:https://itway.iteye.com/blog/1539359

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

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

    Java秒杀系统方案优化高性能高并发学习实战源代码以及笔记..zip

    Java秒杀系统方案优化高性能高并发学习实战源代码以及笔记..zip 章节笔记 第1章-课程介绍及项目框架搭建 知识点 使用spring boot 搭建项目基础框架 使用Thymeleaf做页面展示,封装Result统一结果 集成 mybatis + ...

    net学习笔记及其他代码应用

    CLR:公共语言运行库。 15.什么是装箱和拆箱? 答:从值类型接口转换到引用类型装箱。从引用类型转换到值类型拆箱。 16.什么是受管制的代码? 答:unsafe:非托管代码。不经过CLR运行。 17.什么是强类型系统? ...

    Sentinel流量控制由浅入深学习笔记

    广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。 完善的 SPI 扩展点:Sentinel...

    记录各种学习笔记(算法、Java、数据库、并发......).zip

    标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用程序;Java EE(Java Enterprise Edition)提供企业级服务,如Web服务、EJB等;而Java ME(Java Micro Edition...

    c#学习笔记.txt

    c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...

    state threads学习笔记.docx

    协程库state threads library(以下简称st)是一个基于setjmp/longjmp实现的C语言版用户线程库或协程库(user level ...srs流媒体服务器就是基于协程库开发的,这就是它实现高并发的原因。 希望能对初学者有所帮助。

    golang:go语言学习笔记

    go语言学习笔记 该仓库记录的go语言学习笔记 一go语言基础 go语言特点: 运行效率高,且简单易学 跨平台 丰富的标准库 可以直接使用c代码 语言规范支持并发 本节主要内容如下 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9...

    notes-learning-guava:guava学习笔记

    Guava学习笔记笔记的大部分中文翻译内容来源于以下译者: 沉义扬,罗立树,何一昕,武祖校对:方腾飞感谢给我们带来的这一系列好文章。引言Guava工程包含了若干被Google的Java项目广泛依赖的核心库,例如:集合...

    java源码分析工具-Java-Learn:Java学习笔记-java学习笔记,包括JVM,并发,JDK一些工具的源码,各种书籍,spring

    本仓库是笔者在学习过程中的知识总结,内容以Java后端的知识总结为主。 【个人博客】 Ⅰ Ⅱ Ⅲ Ⅳ Ⅴ Ⅵ Ⅶ Ⅷ 算法 操作系统 网络 数据库 Java JavaWeb 分布式 设计模式 算法 :pencil: 操作系统 :laptop: 网络 :...

    关于学习笔记整理,包括Linux、Java、数据结构和算法,和一些IT工具的使用.zip

    标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用程序;Java EE(Java Enterprise Edition)提供企业级服务,如Web服务、EJB等;而Java ME(Java Micro Edition...

    Java-notes:Java 知识梳理和学习笔记,计算机网络,数据结构,设计模式等

    Java 的学习笔记和整理的知识点,包含Java语言基础、Java服务端方向的框架、设计模式、计算机网络、算法、Java 虚拟机和数据库等多个方面的内容。想了解前端的内容参考,Android相关的内容参考。 目录结构 语言基础...

    Golang 学习笔记—–Goroutine

    关于并发与并行 关于协程  关于goroutine 使用 单个 多个 池  同步  介绍  互斥锁 读写锁 原子操作  执行   可增长的栈  goroutine调度  GOMAXPROCS 回收 sync.WaitGroup  sync.Once sync.Map    泄露 ...

    高级java笔试题-awesome-learning:Github仓库学习资源!

    高级java笔试题 awesome-learning Github repository ...记录各种学习笔记(算法、Java、数据库、并发......) Design patterns implemented 进阶/博客/笔记 很全面的学习笔记,偏向 Android 和 Java To

    Notes:开发Java开发学习笔记

    :books:学习是一个不断模仿,练习,创新,超越的过程,一起努力吧〜 本仓库正在不断更新,敬请期待 :glowing_star: 〜 :high_voltage: | :sparkles: | :bookmark_tabs:计算机基础 数据结构 算法 :fire: ...

    数据库系统概论第5版PPT

    主要内容包括数据库建模、关系模型和关系运算、数据库语言SQL(包括最新标准 SQL2和SQL3)及其系统环境、关系数据库设计理论及数据库设计、面向对象的对象定义语言和对象查询语言、以及查询优化和并发控制。...

Global site tag (gtag.js) - Google Analytics