Java 阻塞队列
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
用put() 和 take() 是阻塞
不要用poll()和offer() ,要用也要用带时间参数的
锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如
ReadWriteLock
的读取锁。synchronized 每个对象相关的隐式监视器锁的访问,强制所有锁获取和释放均要出现在一个块结构中:当获取了多个锁时,它们必须以相反的顺序释放,且必须在与所有锁被获取时相同的词法范围内释放所有锁。
Lock
Lock
实现提供了使用 synchronized
方法和语句所没有的其他功能,包括提供了一个非块结构的获取锁尝试 (tryLock()
)、一个获取可中断锁的尝试
(lockInterruptibly()
)
和一个获取超时失效锁的尝试 (tryLock(long,
TimeUnit)
)。
Lock
类还可以提供与隐式监视器锁完全不同的行为和语义,如保证排序、非重入用法或死锁检测。如果某个实现提供了这样特殊的语义,则该实现必须对这些语义加以记录。
ReentrantLock
一个可重入的互斥锁
Lock
,它具有与使用
synchronized
方法和语句所访问的隐式监视器锁相同的一些基本行为和语义,但功能更强大。Condition
Condition
将 Object
监视器方法(wait
、notify
和 notifyAll
)分解成截然不同的对象,以便通过将这些对象与任意
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
{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
发表评论
-
java 中的 . 问题
2014-11-25 16:47 0if(value.startsWith(".&qu ... -
java.net.MalformedURLException: Unsupported protocol: jmxmp
2013-01-08 14:56 0(java.net.MalformedURLException ... -
eclispe批量删除java工程里所有不必要的引用
2013-01-07 15:38 1516当java项目很大的到一定规模的时候,就有必要管理一下 Jav ... -
CronTrigger 含义
2010-11-01 10:13 866如果你需要像日历那 ... -
java io
2010-10-26 14:13 934Apache common 解决所有java io问题 ... -
软件开发分类
2010-10-20 20:42 894软件行业是可以分为算法密集型,典型的比如一个搜索引擎 Ca ... -
JVM学习笔记(二)------Java代码编译和执行的整个过程(转)
2010-09-27 09:42 792http://blog.csdn.net/cutesource ... -
java 数据传递
2010-09-20 16:57 699java 基本类型值传递,对象是传递引用的值(地址值) 没有 ... -
Java 位移操作
2010-09-08 15:25 966a)“>>”运算符 ... -
osgi 问题
2010-08-11 16:54 0osgi问题: OSGi这东西对大多数业务应用来说,完全是鸡 ... -
javaws -viewer
2010-08-04 15:38 986javaws -viewer 查看java web star ... -
build spring error
2010-07-28 22:56 1120build spring occurs probelm ... -
JPA 学习
2010-07-20 18:57 915java.lang.IncompatibleCla ... -
logger 使用
2010-07-01 16:44 1096在公司内网里发现logger 使用准则。 Logger ... -
AOP学习
2010-06-30 13:32 769软件系统的某些功能例如安全,登录,权限控制等,需要应用在程序里 ... -
Java序列化
2010-06-30 13:32 741java序列化只序列化如下: 1)对象的类型 2)对象属 ...
相关推荐
第15章可能涉及的话题有IO流、网络编程,而第17章可能涵盖了反射、注解或Java的高级特性如并发编程。 在学习这些章节时,学生应该首先理解每章的基础概念,然后通过阅读和分析提供的代码来加深理解,最后尝试自己...
Java集合框架(如ArrayList、HashMap)的使用,线程并发编程,以及如何利用设计模式(如工厂模式、单例模式)来提高代码复用性和可维护性,都是Java开发者必备的知识。 如果项目涉及到数据库交互,那么Java的JDBC...
2. 并发处理:通过线程池管理并发请求,提高系统吞吐量,确保服务稳定。 3. 扩展性设计:为应对未来需求变化,系统应具备良好的模块化和解耦特性,方便功能扩展和升级。 六、部署与维护 1. 系统部署:可选择单机...
Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Java并发编程实战62-Jav
这样可以减少数据库连接的创建和销毁带来的开销,提高系统的响应速度和并发处理能力。 在描述中提到的`database.java`,可能是一个自定义的Java类,实现了连接池的功能。这个类通常会包含以下关键组件: 1. **连接...
"jav.rar_JAV"这个压缩包文件,很显然是与Java学习相关的资源集合,对初学者尤其有帮助。 【Java电子教案】 电子教案通常包含了详细的课程介绍、概念解释、实例演示和习题解答,是学习Java编程的重要辅助材料。这...
4. **并发处理**:由于涉及多人同时购买彩票,系统需要处理高并发情况,保证数据一致性。 5. **支付集成**:可能与第三方支付平台(如支付宝、微信支付)集成,实现在线支付功能。 6. **通知机制**:当有新的彩票...
3. **多用户并发处理**:聊天系统需要支持多个用户同时在线交谈,这需要服务器能够处理并发请求。Java的线程模型和并发库可以有效地管理多个用户连接。 4. **聊天室或一对一聊天**:系统可能包含公共聊天室供用户...
这样可以避免频繁地创建和销毁线程带来的性能损失,同时也能更好地控制系统的并发程度。 Java通过`java.util.concurrent`包中的`ExecutorService`接口和`ThreadPoolExecutor`类实现了线程池。`ExecutorService`是...
以上只是Java API中的一小部分知识点,实际上Java API涵盖了更多主题,如并发控制、XML处理、数据库连接、日期时间处理等。通过深入学习和熟练使用Java API,开发者可以构建出高效、可靠的Java应用程序。
`Thread`类代表了程序中的一个执行线程,而`java.util.concurrent`提供了并发工具类,如`ExecutorService`和`Future`,便于管理线程池和异步任务。 5. **网络编程**:`java.net`包包含了处理网络连接的类,如`...
【标题】中的“jav经典小程序,五子棋,聊天程序,扫雷程序”指的是使用Java编程语言编写的一些经典的小型应用程序。这些程序包括了大家熟知的娱乐游戏——五子棋,一个实现基本通信功能的聊天程序,以及模拟经典...
8. **多线程**:如果系统涉及并发处理,比如同时处理多个学生的数据,可能会用到Thread类或Runnable接口实现多线程。 9. **设计模式**:虽然作为初学者的练习项目,但可能涉及一些基本的设计模式,如单例模式(用于...
- **解释**: 详细说明了如何使用Java代码创建SOAP请求消息,并发送给Web服务端。这通常涉及到构建SOAP消息体、设置HTTP头部信息等步骤。 ##### 食谱13: 生成随机字母数字字符串 - **知识点**: 随机数生成、字符串...
9. **可扩展性**:随着用户数量的增长,系统应能处理高并发请求,并且具备良好的扩展性,以适应未来的功能升级和性能优化。 10. **用户反馈与支持**:系统应包含帮助文档和在线客服功能,方便用户解决问题和提供...
这个工具包,名为"Network.JAV_NetworkjAVcom_jav.nn",提供了在Java环境中搭建和操作神经网络所需的各种功能。从给定的标签来看,我们可以推测这个库支持Java 1.2或更高版本,并且专注于神经网络的实现。 神经网络...
在本课程中,我们将深入探讨Java高并发秒杀API的设计与实现,重点在于业务分析以及DAO(Data Access Object)层的构建。秒杀系统在电商、票务等场景中广泛应用,其核心挑战在于如何处理短时间内大量用户同时请求的高...
这样,服务器可以同时处理多个并发的客户端连接。 **总结** "JAV A 简单服务器 和客户端"项目提供了一个基础的网络通信模型,展示了如何使用Java实现服务器和客户端的交互。通过这个项目,我们可以学习到Java中的...
4. 并发处理:在多线程环境中,确保对共享资源(如接收缓冲区)进行适当的同步。 总结来说,Delphi和Java都提供了方便的API来实现UDP通信。理解UDP的工作原理并掌握如何在这些语言中编写UDP客户端和服务器是网络...
这个"JAVA知识图谱"涵盖了Java开发中的核心概念和技术,包括JVM(Java虚拟机)、JMM(Java内存模型)、JUC(Java并发工具包)、NIO(非阻塞I/O)、Netty(高性能网络应用框架)、IOC( inversion of control,控制...