![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
文章平均质量分 61
weeweee
1、5年java程序开发经验,熟悉JavaEE及其相关技术;3年研发团队管理及软件设计经验<br/>2、享受编程的乐趣,喜欢简洁的代码,热爱阅读<br/>3、善于学习新的知识,对新技术上手较快;有较强的环境适应能力,具有良好的团队协作精神,能吃苦耐劳,性格活泼开朗,善于与人相处
展开
-
多线程简介
线程是比进程更小的单位,一个进程可以由很多的线程组成。每个进程都有一段专用的内存区域,而线程间可以共享相同的内存区域(包括代码和数据),并利用这些共享单元来实现数据交换、实时通信和必要的同步操作。每个java程序都有一个默认的主线程。每个main方法可以启动一个线程,这个线程叫做“主线程”,然后可以通过“主线程”创建新的线程。正常的线程在创建后如果没有外部原因,生命周期不再受创建它的线程关联,原创 2012-12-03 22:25:00 · 385 阅读 · 0 评论 -
原子变量和非阻塞同步机制
现在并发算法领域多数研究都侧重于非阻塞算法,这种算法利用底层的原子机器指令代替锁来确保数据在并发中的一致性。非阻塞算法在设计和实现上比锁方案要复杂的多,但是它能够提供更好的可伸缩性和活跃性。我们可以使用原子变量来构建高效的非阻塞算法。原子变量不光可以用在构建非阻塞算法上,它还可以当做volatile同时还可以支持原子更新操作。锁的劣势现在JVM对非竞争的锁获取和释放等操作进行了极大的优原创 2013-02-22 23:00:38 · 503 阅读 · 0 评论 -
显式锁
在java5之前,在协调对共享对象的访问时可以使用的机制只有synchronized和volatile。5新增了一种机制,ReentrantLock。与之前的机制不同的是,ReentrantLock不是一种替代内置锁的机制,而是当内置锁机制不适用时,作为一种可选择的高级功能。LockLock是显式锁的抽象接口,提供了加锁、解锁等功能。它提供了一种无条件的、可轮询的、定时的以及可中断的锁获取原创 2013-02-21 22:10:06 · 940 阅读 · 0 评论 -
并发性能和可伸缩性
线程的主要目的就是提高程序的运行性能。此外,线程还可以使程序在运行现有任务的情况下立即开始处理新的任务,从而提高系统的响应性。性能的思考提升性能意味着可以用更少的资源做更多的事情。但是提升性能会带来额外的复杂度,这会增加线程的安全性和活跃性上的风险。我们渴望提升性能,但是还是要以安全为首要的。首先要保证程序能够安全正常的运行,然后在需要的时候进行性能优化。这个要求很类似于重构,呵呵原创 2013-02-20 22:12:06 · 1198 阅读 · 0 评论 -
活跃性问题
JAVA应用程序无法从死锁中恢复,如果遇到这种情况我们就只能终止并重启它,并寄希望它不会再次出现。因此在设计的时候一定要排除那些可能导致死锁出现的条件。死锁不是每次都出现,但往往实在最糟糕的情况--高负载的时候出现。呵呵死锁对于死锁要注意由多个线程形成的环路的锁依赖关系,很容易导致死锁。锁顺序死锁当2个线程试图以不同的顺序调用相同的锁,就有可能发生顺序死锁。如:A--->锁原创 2013-02-19 22:51:41 · 1944 阅读 · 0 评论 -
任务执行与取消
任务执行任务是一组逻辑业务单元,通常是一些抽象的且离散的工作单元,线程则是使任务异步执行的机制。围绕“任务执行”来设计应用程序时,首先要做的就是找出清晰的任务边界。理想情况下任务之间应该是相互独立的,且不依赖于其他任务的状态、结果和边界效应。对于大多数服务器的应用程序而言,以独立的客户请求为边界。有2中任务执行策略:串行执行。所有任务都在一个线程中,顺序执行。串行的任务执行吞吐原创 2013-02-18 23:01:16 · 1078 阅读 · 0 评论 -
并发基础模块
JAVA提供了很多并发的基础模块,来帮助我们构建线程安全的类。这里做一下简要的介绍。帮助构建一个并发模块框架。同步容器类早起的Vector和HashTable都是同步容器。同步容器类,通过将它们的状态封装起来,并对每个公有方法都进行同步,使得每次都只有一个线程能访问容器的状态。同步容器类将并发的操作转换为串行的。当然同步容器是线程安全的。我们也可以使用同步封装器,Collectio原创 2013-02-13 23:11:18 · 373 阅读 · 0 评论 -
并发简介
简介线程是轻量级的进程。多数操作系统都是以线程作为基本的调度单位,而不是进程。如果没有明确的协同机制,线程彼此间是独立的。由于同一个进程内的所有线程都将彼此共享进程的内存地址空间,因此这些线程都能访问相同的变量并在同一个堆上分配对象,这就需要实现一种比在进程间共享数据粒度更细的数据共享机制。我们为什么要实现多个程序同时运行?资源利用公平性便利性线程的优势线程可以有效的降低程原创 2013-02-08 21:58:13 · 284 阅读 · 0 评论 -
Atomic
JAVA提供了一个原子化包,支持在单个变量上接触锁定的线程安全编程。效果应该要好于volatile,因为volatile只能保证提取最新的值,而原子化变量却可以保证变量内状态的操作的原子性。原子化的变量类型并不是真正对应的类型,如:AtomicBoolean与真正的Boolean,没有直接的关系,更无从与继承什么的亲密关系了。所以对于常见的类型的操作这里不一定会提供,这是需要注意的。而且由于原原创 2013-01-16 22:17:13 · 344 阅读 · 0 评论 -
同步(1)
在多线程中,某些公用资源会被多个线程同时使用,但是如果不同的线程对同一个资源使用完全相反的操作或是改变状态等操作,那么会导致资源数据或是状态的不正确变化,为了避免此类问题,java提出了同步机制。synchronizedsynchronized是java提供的关键字,常用来修饰函数及其内的语句,这也就是我们平时所说的同步方法和同步块。该关键字通过锁定公共资源来达到资源同步的效果,任何时刻都原创 2012-12-22 21:57:41 · 217 阅读 · 0 评论 -
同步(2)
在JAVA的语言规范中指出,为了获得最佳的速度,允许线程保存共享成员变量的私有拷贝,只有当线程进入或是离开同步代码块时才与共享成员变量的原始值对比,如果不同则修改为新的值。以上的规范说明了,每个线程在操作共享成员变量的时候是先将它处理为线程内的一个私有变量,这样每个线程在处理对应的共享成员变量时是互不影响的,而且在处理完成后将值回写到真实的成员变量上。这个过程及易导致同步问题。之前我们讨论原创 2012-12-26 23:16:38 · 289 阅读 · 0 评论 -
在多线程下的long和double
在看一些代码的时候,会发现在定义long型和double型的变量时,会在前面加上volatile关键字,当然也会看到在其它原子类型的变量前加上这个关键字,但这里要说的还是有区别的。 在java中,java的内存模型要求,变量的读取操作和写入操作都必须是原子操作的,但是对于非volatile类型的long和double有些不同,因为这两个变量是64位存储,JVM允许将64位的读操作或转载 2013-05-28 23:14:29 · 720 阅读 · 0 评论