- 浏览: 175813 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (140)
- java (138)
- 佳能500d (1)
- 佳能 (1)
- Oracle数据库文档构造器--Oraschemadoc (1)
- EJB调用的原理分析 (1)
- 使用css3画"静音"icon (1)
- 张小庆,在路上(16)-给弟弟找工作 (1)
- Android短信编解码方式 (1)
- lua web 开发 (1)
- zk安装 (1)
- 菜单多国语言化遇到的问题 (1)
- 【转】纯文本配置还是注册表 (1)
- C++ delete删除动态分配的内存 (1)
- eclipse下修改项目名导致tomcat内发布名不一致的解决方法 (1)
- Lucene实现各种常见文档的全文检索 (1)
- 项目风险之人员流动风险 (1)
- 时空数据模型简介 (1)
- XSLT学习笔记 (1)
- 依然是计划 如果没有计划似乎就没有了动力 (1)
- How to Succeed in A Professional Career (1)
- 编程环境应该和讨论社区完美的进行结合 (1)
- C#坦克大战实现 (1)
- 电脑用户密码忘记了怎么办? (1)
- java.lang.NoClassDefFoundError: org/dom4j/DocumentException (1)
- 关于成立北京Android爱好者俱乐部的声明 (1)
- Android开发之初探音频的播放 (1)
- Struts标签循环List (1)
- CAP原理 (1)
- javabean的自动生成 (1)
- 打开CMD一闪就关的解决方案 (1)
- 我是项目经理,我的项目管理日记【20111202】 (1)
- Html5游戏开发入门笔记--<躲砖块> (1)
- mysql中查看和设置系统字符编码 (1)
- PhoneGap-Accelerometer (1)
- [Jetty]Jetty工作原理 (1)
- Ibatis+Spring整合实例Demo+源码 (1)
最新评论
-
u012985907:
dsdsdsdsd
FLASH上传与拍照 -头像-avatart -
a379933101:
?????????????????????????????
android listview 连续调用 getview问题分析及解决 -
151tmac:
拜托下次粘贴的时候,粘贴为纯文本
android listview 连续调用 getview问题分析及解决 -
liudezhong135:
...
Spring3MVC 在JSP中使用@ModelAttribute -
香飘飘2011:
要是不知道层次级别,如何退回到根目录呢
FTP退回到根目录
ava.util.concurrent包中包含了java并发编程的解决框架
1、synchronized:在java中每个对象其实都有一个隐藏的锁对象,当给方法加上szhcnronized的时候相当于该对象加上同步块。比如
public class adder{
public int i;
public synchronized void add(){i++;};
}
其实它与
public class adder{
public int i;
object lock = new object();
public void add(){
synchronized(lock){
i++;
};
};
}是一样的道理,只不过前者用到的锁是隐藏的,如果外部也想获得该锁便无能为力了。如果还只是这样的案例那么自己定义一个object,再用同步块的方法也能够解决问题。实际多线程编程并不如此简单,请看2
2、reentranlock,可重入的锁,标准使用方式为
lock.lock();
try{...;}catch(exception e){}finally{lock.unlock();},这个东西刚出来的时候网上就有好多人浮燥地认为reentranlock比synchronized要高效,
我敢保证,很多搞j2ee的都是人云亦云之辈,没有做过深入的调查的。就拿上面多线程加法运算来说吧,100万次加法的时候synchronized关键字与synchronzed同步块所需的时候非常接近。
而reentranlock则需要耗费较多时间,我猜应该是try{}catch块影响了效率。所以说在简单的同步代码中完全没必要用到reentranlock,除非你确实没办法只用synchronzed解决问题,或者需要synchronzed + object的wait()/notify()
的时候才需要考虑引入reentranlock。哎,现在的程序员为什么都越来越浮燥了呢,搞不懂,一有新的东西出来就一窝蜂似地跑过去追逐,跟追星族有什么两样?静下心来学基础才是最重要的。
3 volatile,这个东西呢其实也就是声明你的变量在做运算的时候只有主存中的那一份。只有一份东西了,多个线程对它做操作肯定是安全的了吧?错!虽然东西只有一份,但它只对原子操作才安全。例如
valatile i;
public void add(){
int i++;
}
上面是典型的错误代码,因为i++是一个compareandswap操作,先比较再赋值,有可能这个线程在比较完的时候另外一个线程刚好做了赋值操作,而当前线程又做赋值操作的时候用的还是老的值,结果造成丢1。
而对于形如 public void seti(int i){this.i = i;} 这样的操作是安全的。
4、atomic包,提供了原子更新字段的若干类,atomicboolean、atomicinteger、atomiclong分别是原子更新boolean integer和long的三个类,而atomicintegerarray和atomiclongarray分别是用来原子更新integer[]和long[]的。atomicintegerfieldupdate和atomiclongfieldupdate分别是用反射的方式来更新
一个对象里面的volatile的int和long字段的。atomicreference这个类比较经常关键,是用来原子更新引用的。其实原子更新是基于compare and swap(cas)来完成的。每个类的内部其实也是通过调用sun.misc.unsafe的comapreandset来实现的。
5、locks包。还看不太懂abstractqueuedsynchronizer和具体机制,只知道是将线程维护在一个双向队列里,然后根据外部的acquire或release来锁定或释放。lock readwritelock reteenlock 及condition是dong lea提供给我们使用的现成的东东。
condition属于lock,这样就可以通过condition的await或signal来阻塞线程,这事要换做以前得用synchronized + object的基础wait/notify才能搞定。
6、arrayblockingqueue,一个指定大小的可阻塞队列。blockingdeque是双向的可阻塞队列。
7、concurrenthashmap。这东西说白了就是把分段存储,基于段的锁定,在写操作的时候不同段之间便无需同步。在读操作的时候不上锁读,当元素为空时(刚好有读线程在进行设置操作)再上锁读。效率相当高。
8、至于copyonwrite的东东只建议在极少写操作的时候才使用它,特别是在元素多的时候copy是相当耗时的。
....
1、synchronized:在java中每个对象其实都有一个隐藏的锁对象,当给方法加上szhcnronized的时候相当于该对象加上同步块。比如
public class adder{
public int i;
public synchronized void add(){i++;};
}
其实它与
public class adder{
public int i;
object lock = new object();
public void add(){
synchronized(lock){
i++;
};
};
}是一样的道理,只不过前者用到的锁是隐藏的,如果外部也想获得该锁便无能为力了。如果还只是这样的案例那么自己定义一个object,再用同步块的方法也能够解决问题。实际多线程编程并不如此简单,请看2
2、reentranlock,可重入的锁,标准使用方式为
lock.lock();
try{...;}catch(exception e){}finally{lock.unlock();},这个东西刚出来的时候网上就有好多人浮燥地认为reentranlock比synchronized要高效,
我敢保证,很多搞j2ee的都是人云亦云之辈,没有做过深入的调查的。就拿上面多线程加法运算来说吧,100万次加法的时候synchronized关键字与synchronzed同步块所需的时候非常接近。
而reentranlock则需要耗费较多时间,我猜应该是try{}catch块影响了效率。所以说在简单的同步代码中完全没必要用到reentranlock,除非你确实没办法只用synchronzed解决问题,或者需要synchronzed + object的wait()/notify()
的时候才需要考虑引入reentranlock。哎,现在的程序员为什么都越来越浮燥了呢,搞不懂,一有新的东西出来就一窝蜂似地跑过去追逐,跟追星族有什么两样?静下心来学基础才是最重要的。
3 volatile,这个东西呢其实也就是声明你的变量在做运算的时候只有主存中的那一份。只有一份东西了,多个线程对它做操作肯定是安全的了吧?错!虽然东西只有一份,但它只对原子操作才安全。例如
valatile i;
public void add(){
int i++;
}
上面是典型的错误代码,因为i++是一个compareandswap操作,先比较再赋值,有可能这个线程在比较完的时候另外一个线程刚好做了赋值操作,而当前线程又做赋值操作的时候用的还是老的值,结果造成丢1。
而对于形如 public void seti(int i){this.i = i;} 这样的操作是安全的。
4、atomic包,提供了原子更新字段的若干类,atomicboolean、atomicinteger、atomiclong分别是原子更新boolean integer和long的三个类,而atomicintegerarray和atomiclongarray分别是用来原子更新integer[]和long[]的。atomicintegerfieldupdate和atomiclongfieldupdate分别是用反射的方式来更新
一个对象里面的volatile的int和long字段的。atomicreference这个类比较经常关键,是用来原子更新引用的。其实原子更新是基于compare and swap(cas)来完成的。每个类的内部其实也是通过调用sun.misc.unsafe的comapreandset来实现的。
5、locks包。还看不太懂abstractqueuedsynchronizer和具体机制,只知道是将线程维护在一个双向队列里,然后根据外部的acquire或release来锁定或释放。lock readwritelock reteenlock 及condition是dong lea提供给我们使用的现成的东东。
condition属于lock,这样就可以通过condition的await或signal来阻塞线程,这事要换做以前得用synchronized + object的基础wait/notify才能搞定。
6、arrayblockingqueue,一个指定大小的可阻塞队列。blockingdeque是双向的可阻塞队列。
7、concurrenthashmap。这东西说白了就是把分段存储,基于段的锁定,在写操作的时候不同段之间便无需同步。在读操作的时候不上锁读,当元素为空时(刚好有读线程在进行设置操作)再上锁读。效率相当高。
8、至于copyonwrite的东东只建议在极少写操作的时候才使用它,特别是在元素多的时候copy是相当耗时的。
....
发表评论
-
Ibatis+Spring整合实例Demo+源码
2012-02-08 12:58 1402<span style="color: ... -
[Jetty]Jetty工作原理
2012-02-07 17:29 993http://www.ibm.com/develo ... -
PhoneGap-Accelerometer
2012-02-07 14:23 1207采集设备在x、y、z方向上的动作。 acce ... -
mysql中查看和设置系统字符编码
2012-02-04 14:28 1707--查看数据库的字符集 show variables ... -
Html5游戏开发入门笔记--<躲砖块>
2012-02-03 12:04 1168学习了html5中的canvas画布元素,自己写了一个 ... -
我是项目经理,我的项目管理日记【20111202】
2012-02-03 10:19 994其实前段时间项目 ... -
打开CMD一闪就关的解决方案
2012-02-02 12:14 1386转:http://blog.163.com/cumt_ ... -
javabean的自动生成
2012-02-02 11:59 1399在jcreator pro中自动生成 在j ... -
CAP原理
2012-02-01 09:00 1151作者:NinGoo 原文链接:ht ... -
Struts标签循环List
2012-01-31 14:18 966<pre name="code&quo ... -
Android开发之初探音频的播放
2012-01-11 16:29 1086<h1>Android开发之初探音频的播放 ... -
关于成立北京Android爱好者俱乐部的声明
2012-01-11 14:33 860<blockquote dir="lt ... -
java.lang.NoClassDefFoundError: org/dom4j/DocumentException
2011-12-28 13:03 15095<span style="font-f ... -
电脑用户密码忘记了怎么办?
2011-12-28 12:14 981<span style="fon ... -
C#坦克大战实现
2011-12-20 13:29 1121记得在大学学java ... -
编程环境应该和讨论社区完美的进行结合
2011-12-19 11:54 761在学习.NET过程中,经常会遇到很多问题,有的时候会找 ... -
How to Succeed in A Professional Career
2011-12-19 10:29 731(From Microsoft)<br>& ... -
依然是计划 如果没有计划似乎就没有了动力
2011-12-15 10:39 878</span></span>& ... -
XSLT学习笔记
2011-12-14 14:04 668<p class="MsoNorma ... -
时空数据模型简介
2011-12-14 13:59 1482<p class="MsoNo ...
相关推荐
NULL 博文链接:https://wensiqun.iteye.com/blog/1226770
并发作为 Java 中非常重要的一部分,其内部大量使用了 Unsafe 类,它为 java.util.concurrent 包中的类提供了底层支持。
开始从原始二进制研究Concurrent包,以及其他并发相关的包,对于途中遇到的不明白的东西,也会作相应了解。 该项目的缘由是看CopyOnWriteArrayList二进制时,对Unsafe类一无所知,才有了好钻钻一番的冲动。 ...
Java并发包源码分析(JDK1.8):囊括了java.util.concurrent包中大部分类的源码分析,其中涉及automic包,locks包(AbstractQueuedSynchronizer、ReentrantLock、ReentrantReadWriteLock、LockSupport等),queue...
collection Java 源码 概述 主要分析 JDK8 源码。 基础 java-io java-nio java-reflect java-collection java-annotation java-net java-jdbc java-concurrent java-jvm java8
java netty 源码 项目由一下几个部分组成: 1.guava: guava源码demo; 2.jdk: jdk8相对于jdk7的新特性: java.util.stream ...java.util.concurrent; 3.netty: io基础,bio,nio,aio; netty服务端客户端demo;
java-high-concurrent-programming 《实战Java高并发程序设计》源码整理,github上已经有人整理了,但是最近在看这本书,还是自己把每章代码整理下,也加深下自己的理解. 目录 第一章:走入并行世界 第二章:Java...
jdk源码阅读注释 org.xpen.concurrent CLH 自旋锁,AbstractQueuedSynchronizer类研究 org.xpen.cv.opencv.FaceDetection opencv人脸识别,flandmark眼睛,鼻子,嘴检测 org.xpen.cv.tesseract tesseract文字识别 org....
java8 源码 学习笔记(持续更新中) 所有文章均同步发布到微信公众号【JavaRobot】,关注微信公众号,...Concurrent源码系列 待完善 JVM(Java虚拟机) 类加载 垃圾回收算法 JavaConcurrent(Java并发系列) 【Java并发系列】
JDK API. the source code analyse articles can find @my blog 参考资料: 视频: 【1】. 刘意JavaSE视频--【主导】 【2】. 张龙-圣思源视频课程--【深入源码和各种设计模式】 -----------------------------------...
源码 javase 用于练习Java基础代码。 collections 用于普通的集合的用法。 Reference的实例。 concurrent-module 代码来自Java8 in action,主要写的是异步计算CompleteableFuture用法。 还有部分同步的集合类的代码...
[1]中博主自己通过ThreadGroup实现一个线程池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了现成的线程池。 [2]中介绍了java.util.concurrent.Executors类的API。 [3]中介绍了Java中线程池的类体系...
源码 SpringTree springboot mybatis mysql zookeeper mongodb kafka rocketmq memcached es lamda fork/join ThreadPool 微信支付 Elasticsearch 1:微信支付,暂时只支持公众号网页(调用微信客户端)支付,不支持...
LockSupport是JDK1.6中在java.util.concurrent中的子包locks中引入的一个比较底层的工具类,用来创建锁和其他同步工具类的基本线程阻塞原语。java锁和同步器框架的核心 AQS: AbstractQueuedSynchronizer,就是通过...
《实战Java高并发程序设计》笔记和源码笔记《实战Java高并发程序设计》中有很多代码范例,适合初学者通过实践入门并发编程,这本书有个问题就是前面的代码都用JDK7,第六章开始又用JDK8了笔者精心制作相关笔记并整理...
java数据分析源码 一、多线程高并发(concurrent、jvm包) 1.JUC多线程及高并发 1.1 多线程集合 1.2 cas 1.3 锁 1.4 队列 1.5 线程池 2.JVM+GC解析 demo 二、JDK8新特性(lamp包) 1.四大函数式接口 2.方法引用 3....
在此方法出现在HashMap里面之前,JDK给出的解决方案是ConcurrentMap的putIfAbsent()方法。 出现在HashMap里面的这个putIfAbsent()方法与之前的解决方法具有相同的功能, 4.2 特点 1.当value为null的时候,put
在此基础上,我们会进一步分析java.util.concurrent包的工具类,包括其使用方式、实现源码及其背后的原理。本文是该系列的第一篇文章,是这系列中核心的理论部分,之后的文章都会以此为基础来分析和解释。 一、...
下面我们就开启优雅Java编程学习之旅! 项目相关信息: 官方首页:http://code.google.com/p/guava-libraries 官方下载:http://code.google.com/p/guava-libraries/downloads/list 官方文档:...
该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! ...