SlideShare uma empresa Scribd logo
1 de 41
Concurrent Tips 祢衡@alipaywww.beralee.com
主要知识 ,[object Object]
找出并发问题
Java的并发控制
数据库的并发控制,[object Object]
什么情况下会并发? 几乎所有的场景
应用服务器的架构 ,[object Object]
WebService访问
ESB
Notify
Database……
并发带来了什么? ,[object Object]
相对复杂的编程
难以发现的潜在问题
错误数据和结果,[object Object]
如何判断有状态? 如果在不同的时间点使用相同的参数访问同一个方法,返回了不同的值,那么这个对象就是有状态的
并发问题的根本原因 所有的并发问题 都是由状态引起的
并发问题的根本原因 准确的说,是 不稳定的状态
Java对并发的控制 ,[object Object]
Java.util.concurrent.* 一系列的并发措施:
Lock
Atomic
BlockingQueue
ConcurrentHashMap……
Synchronized 理解锁的是谁?
一个计数器 publicclassUnSafeCounter{ privateintvalue; publicintgetNext(){ 	returnvalue++; } } 非线程安全,value++不是原子操作,value状态不稳定,需要同步
publicclassSafeCounter{ privateintvalue; publicsynchronizedintgetNext(){ 		returnvalue++; 	} } 线程安全,锁的对象是当前SafeCounter实例,不会影响到另一个SafeCounter实例的getNext方法
publicclassSafeCounter{ privateintvalue; privatefinal Object lock=new Object(); publicintgetNext(){ 	synchronized(lock){ 		returnvalue++; 		} 	} } 线程安全,锁的对象是lock,可以灵活控制,只锁真正需要同步的代码,最佳实践。注意lock不能为null,也不能改变
publicclassSafeCounter{ privateintvalue; publicintgetNext(){ 	synchronized(SafeCounter.class){ 		returnvalue++; 		} 	} } 线程安全,锁的对象是SafeCounter类,任何实例都会受锁的影响,一般不这样用
更好的Lock Lock lock=newReentrantLock(); lock.lock(); try{ // update object state } finally{ lock.unlock(); } //尝试获得锁 if(lock.tryLock()){ System.out.println("获得锁了"); }else{ System.out.println("有人在用"); } 灵活控制锁竞争时的处理,拥有更好的性能
Atomic publicstaticAtomicLongatomicLong=newAtomicLong(); publicstaticlonggetNext(){ 	returnatomicLong.getAndIncrement(); } 最佳实践:使用原子操作类,非阻塞,获得最好的性能。
并发异常 publicclass Cache { 	publicstatic List<Object>cacheList=newArrayList<Object>(); 	publicstatic Map<String,Object>cacheMap=newHashMap<String,Object>(); } 多线程操作时抛出java.util.ConcurrentModificationException异常,快速失败
防止并发异常 ArrayList----Vector Hashmap----HashTable Collections.synchronizedList(new ArrayList(...)) Collections. synchronizedMap(new HashMap(...)) synchronized (list){ …… }  Vector HashTable性能低下 Collections.synchronizedList更加危险,在负载重的情况下依然会抛出NP或并发异常                   现在已经木有人这么用了….
并发设施 publicclassSafeCache{ publicstatic List<Object>cacheList=newCopyOnWriteArrayList<Object>(); publicstaticConcurrentMap<String,Object>cacheMap=newConcurrentHashMap<String,Object>(); } 最佳实践:使用java.util.concurrent里的并发设施,它们本身是Lock Free的,从而获得最佳性能。 ConcurrentLinkedQueue BlockingQueue ……
并发辅助工具 CountDownLatch CyclicBarrier Semaphore FutureTask ExecutorService …… 最佳实践:使用java.util.concurrent里的并发控制工具,代替notifyAll,wait, join
CountDownLatch ,[object Object]
countDown() 倒数
await()   阻塞等待
所有线程启动后await等待,直到countDown到0时大家一起跑,模拟并发
每条线程跑完时countDown,所有线程跑完后await释放,代替join,[object Object]
CyclicBarrier ,[object Object]

Mais conteúdo relacionado

Mais procurados

JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程Bobby Zhou
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7javatwo2011
 
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringSpring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringJustin Lin
 
Spring中的object xml映射详解
Spring中的object xml映射详解Spring中的object xml映射详解
Spring中的object xml映射详解leeley2000
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascriptjay li
 
Java面试知识
Java面试知识Java面试知识
Java面试知识yiditushe
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记yiditushe
 
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计hanmo1988
 
Java多线程编程详解
Java多线程编程详解Java多线程编程详解
Java多线程编程详解yiditushe
 
Spring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPSpring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPJustin Lin
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Justin Lin
 
Java 面试32问
Java 面试32问Java 面试32问
Java 面试32问yiditushe
 
Spring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringSpring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringJustin Lin
 
Java多线程设计模式
Java多线程设计模式Java多线程设计模式
Java多线程设计模式Tony Deng
 
系統架構設計 Android
系統架構設計  Android系統架構設計  Android
系統架構設計 Android健裕 潘
 
Javascript share
Javascript shareJavascript share
Javascript shareXu Mac
 
管窥Nodejs的事件——基于观察者模式的事件队列
管窥Nodejs的事件——基于观察者模式的事件队列管窥Nodejs的事件——基于观察者模式的事件队列
管窥Nodejs的事件——基于观察者模式的事件队列Frank Cheung
 

Mais procurados (20)

JavaScript 教程
JavaScript 教程JavaScript 教程
JavaScript 教程
 
千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7千呼萬喚始出來的Java SE 7
千呼萬喚始出來的Java SE 7
 
Sun java
Sun javaSun java
Sun java
 
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 SpringSpring 2.0 技術手冊第六章 - Hibernate 與 Spring
Spring 2.0 技術手冊第六章 - Hibernate 與 Spring
 
Spring中的object xml映射详解
Spring中的object xml映射详解Spring中的object xml映射详解
Spring中的object xml映射详解
 
Js培训
Js培训Js培训
Js培训
 
潜力无限的编程语言Javascript
潜力无限的编程语言Javascript潜力无限的编程语言Javascript
潜力无限的编程语言Javascript
 
Java面试知识
Java面试知识Java面试知识
Java面试知识
 
sorting
sortingsorting
sorting
 
J2ee经典学习笔记
J2ee经典学习笔记J2ee经典学习笔记
J2ee经典学习笔记
 
第9章 t sql程序设计
第9章 t sql程序设计第9章 t sql程序设计
第9章 t sql程序设计
 
Java多线程编程详解
Java多线程编程详解Java多线程编程详解
Java多线程编程详解
 
Spring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOPSpring 2.0 技術手冊第四章 - Spring AOP
Spring 2.0 技術手冊第四章 - Spring AOP
 
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
Spring 2.0 技術手冊第七章 - Spring Web MVC 框架
 
Java 面试32问
Java 面试32问Java 面试32问
Java 面试32问
 
Spring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 SpringSpring 2.0 技術手冊第一章 - 認識 Spring
Spring 2.0 技術手冊第一章 - 認識 Spring
 
Java多线程设计模式
Java多线程设计模式Java多线程设计模式
Java多线程设计模式
 
系統架構設計 Android
系統架構設計  Android系統架構設計  Android
系統架構設計 Android
 
Javascript share
Javascript shareJavascript share
Javascript share
 
管窥Nodejs的事件——基于观察者模式的事件队列
管窥Nodejs的事件——基于观察者模式的事件队列管窥Nodejs的事件——基于观察者模式的事件队列
管窥Nodejs的事件——基于观察者模式的事件队列
 

Destaque

MongoDB介绍
MongoDB介绍MongoDB介绍
MongoDB介绍popeast
 
Big Data Analytics Infrastructure
Big Data Analytics InfrastructureBig Data Analytics Infrastructure
Big Data Analytics InfrastructureMin Zhou
 
Message Queues for Web Applications
Message Queues for Web ApplicationsMessage Queues for Web Applications
Message Queues for Web ApplicationsGareth Rushgrove
 

Destaque (6)

Scala
ScalaScala
Scala
 
MongoDB介绍
MongoDB介绍MongoDB介绍
MongoDB介绍
 
Scala
ScalaScala
Scala
 
Golang
GolangGolang
Golang
 
Big Data Analytics Infrastructure
Big Data Analytics InfrastructureBig Data Analytics Infrastructure
Big Data Analytics Infrastructure
 
Message Queues for Web Applications
Message Queues for Web ApplicationsMessage Queues for Web Applications
Message Queues for Web Applications
 

Semelhante a 并发控制

PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學Bo-Yi Wu
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题yiditushe
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型keelii
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践Li JianYe
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析Justin Lin
 
以太坊(Ethereum) solidity & web3.js
以太坊(Ethereum) solidity & web3.js以太坊(Ethereum) solidity & web3.js
以太坊(Ethereum) solidity & web3.jsHO-HSUN LIN
 
前端MVC之backbone
前端MVC之backbone前端MVC之backbone
前端MVC之backboneJerry Xie
 
jsp基础速成精华讲解
jsp基础速成精华讲解jsp基础速成精华讲解
jsp基础速成精华讲解wensheng wei
 
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构裕波 周
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Servicesjavatwo2011
 
透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 Apps透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 AppsEric ShangKuan
 
The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)jeffz
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统Frank Xu
 
Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训lotusprince
 
第五章解答
第五章解答第五章解答
第五章解答jiannrong
 
Ajax Lucence
Ajax LucenceAjax Lucence
Ajax LucenceRoger Xia
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研lorisjand
 
香港六合彩
香港六合彩香港六合彩
香港六合彩aaveow
 

Semelhante a 并发控制 (20)

PHP & MySQL 教學
PHP & MySQL 教學PHP & MySQL 教學
PHP & MySQL 教學
 
Java华为面试题
Java华为面试题Java华为面试题
Java华为面试题
 
异步编程与浏览器执行模型
异步编程与浏览器执行模型异步编程与浏览器执行模型
异步编程与浏览器执行模型
 
运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践运维系统开发与Rails 3页面开发实践
运维系统开发与Rails 3页面开发实践
 
深入淺出 Web 容器 - Tomcat 原始碼分析
深入淺出 Web 容器  - Tomcat 原始碼分析深入淺出 Web 容器  - Tomcat 原始碼分析
深入淺出 Web 容器 - Tomcat 原始碼分析
 
以太坊(Ethereum) solidity & web3.js
以太坊(Ethereum) solidity & web3.js以太坊(Ethereum) solidity & web3.js
以太坊(Ethereum) solidity & web3.js
 
前端MVC之backbone
前端MVC之backbone前端MVC之backbone
前端MVC之backbone
 
jsp基础速成精华讲解
jsp基础速成精华讲解jsp基础速成精华讲解
jsp基础速成精华讲解
 
从问题开始,谈前端架构
从问题开始,谈前端架构从问题开始,谈前端架构
从问题开始,谈前端架构
 
用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services用JAX-RS和Jersey完成RESTful Web Services
用JAX-RS和Jersey完成RESTful Web Services
 
透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 Apps透過 Windows Azure Mobile Services 開發各平台 Apps
透過 Windows Azure Mobile Services 開發各平台 Apps
 
The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)The Evolution of Async Programming (GZ TechParty C#)
The Evolution of Async Programming (GZ TechParty C#)
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统
 
Asp.net mvc 培训
Asp.net mvc 培训Asp.net mvc 培训
Asp.net mvc 培训
 
第五章解答
第五章解答第五章解答
第五章解答
 
Ajax Lucence
Ajax LucenceAjax Lucence
Ajax Lucence
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
ev2oik
ev2oikev2oik
ev2oik
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 

并发控制