Java并发专题
本专栏包含原创和转载的Java多线程文章,内容详细、覆盖面广,参考了《Java并发编程实践》、《Java编程思想》、《Effective Java》等业内权威书籍,并结合网上的经典实例使读者对并发编程有更加深入的理解。
vanpersie_9987
这个作者很懒,什么都没留下…
展开
-
40个Java多线程问题总结
前言这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的问题。这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。40个问题汇总1、多线程有什么用?一个可能在很多人看来很扯淡转载 2017-04-17 10:16:03 · 554 阅读 · 0 评论 -
Java编程思想-并发(6)
性能调优通过前几篇的介绍,我们知道JDK1.5中的java.util.concurrent包中存在大量的辅助并用于提升性能的类。本文将着重讨论并比较这个包中的部分类之间的性能。比较各类互斥技术首先看看老式的同步机制synchronized关键字和JDK1.5中新的Lock和Atomic类之间的性能差异和适用范围:abstract class Incrementable {原创 2017-04-13 13:25:19 · 570 阅读 · 0 评论 -
Java编程思想-并发(5)
新类库中的构件JDK1.5引入了java.util.concurrent包,它提供了大量的新类,用于安全而高效地解决并发问题。下面将通过例子一一介绍。CountDownLatchCountDownLatch被称为倒数计步器,它是Java内置的同步器的一种(还有信号量、CyclicBarrier等同步器,后续将作介绍)。它的功能是阻塞一个或多个线程,这些阻塞的线程需要等待其他线程中的某一原创 2017-04-10 17:06:05 · 626 阅读 · 0 评论 -
Java编程思想-并发(4)
死锁通过前几篇的介绍,我们知道一个对象可以用synchronized方法或其他形式的加锁机制来防止别的任务在互斥还锁没有释放的时候就访问这个对象。我们还知道,任务可以变成阻塞状态(wait或是await的阻塞方式,即释放锁),所以就可能出现这种情况:某个任务在等待另一个任务,而后者有等待别的任务,这样一直下去,直到链条上的任务有在等待第一个任务释放锁。这就得到了一个任务之间互相等待的连环套,而没有哪原创 2017-04-05 00:44:14 · 480 阅读 · 0 评论 -
Java编程思想-并发(3)
生产者消费者队列使用同步队列来解决任务协作的问题比使用wait和notify更加方便,因为后者需要在每次交互时都握手。而同步队列在任何时刻只允许一个任务插入或移除元素。在java.util.concurrent.BlockingQueue接口中提供了这个队列。原创 2017-04-04 01:00:20 · 367 阅读 · 0 评论 -
Java编程思想-并发(2)
在对象上同步使用synchronized块必须给定一个在其上进行同步的对象。最常见的是synchronized(this),这表示,如果一个线程获得了当前对象的锁,那么该对象其他的synchronized方法和临界区就不能被调用了。下面同步用了两个锁,所以并发访问时,它们相互独立:class DualSynch { private Object syncObject = new Object原创 2017-04-03 15:39:34 · 428 阅读 · 0 评论 -
Java编程思想-并发(1)
线程的基本机制并发编程使我们可以将程序划分为多个分离、独立运行的程序。一个线程就是在进程中的一个执行路径。在使用线程时,CPU将轮流给每个任务分配其占用时间。每个任务都觉得自己在一直占用CPU,但事实上CPU时间是划分成片段分配给了所有的任务(例外情况是程序却是运行在具有多核CPU的设备上)。而线程的一大好处是可以使你从这个层次抽身出来,即代码不必知道它是运行在具有一个还是多个CPU的机器上。原创 2017-04-01 11:36:11 · 1138 阅读 · 0 评论 -
Java并发(六):线程本地变量ThreadLocal、再聊线程池
本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/7451464,转载请注明。ThreadLocal首先说明ThreadLocal存放的值是线程内共享的,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递,这样处理后,能够优雅的解决一些实际问题。public class ConnectionManager {转载 2017-03-28 17:32:50 · 4903 阅读 · 0 评论 -
Java并发(五):Condition-线程通信更高效的方式、CAS
Condition-线程通信更高效的方式上一篇讲述了并发包下的Lock,Lock可以更好的解决线程同步问题,使之更面向对象,并且ReadWriteLock在处理同步时更强大,那么同样,线程间仅仅互斥是不够的,还需要通信,本篇的内容是基于上篇之上,使用Lock如何处理线程通信。那么引入本篇的主角,Condition,Condition 将 Object 监视器方法(wait、notify 和 noti转载 2017-03-28 16:58:41 · 364 阅读 · 0 评论 -
Java并发(四):Callable和Future、锁对象Lock-完美解决同步方式
Callable和FutureCallable接口类似于Runnable,从名字就可以看出来了,但是Runnable不会返回结果,并且无法抛出返回结果的异常,而Callable功能更强大一些,被线程执行后,可以返回值,这个返回值可以被Future拿到,也就是说,Future可以拿到异步执行任务的返回值,下面来看一个简单的例子:public class CallableAndFuture {转载 2017-03-28 16:10:06 · 1946 阅读 · 0 评论 -
Java并发(三):Timer和TimerTask、线程池
Timer和TimerTaskTimer和TimerTask可以做为实现线程的第三种方式,前两中方式分别是继承自Thread类和实现Runnable接口。Timer是一种线程设施,用于安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行,可以看成一个定时器,可以调度TimerTask。TimerTask是一个抽象类,实现了Runnable接口,所以具备了多线程的能力。一个Timer可转载 2017-03-28 15:42:32 · 3210 阅读 · 0 评论 -
Java并发(二):线程协作 生产者/消费者、线程中断、线程让步、线程睡眠、线程合并
线程协作-生产者/消费者上一篇讲述了线程的互斥(同步),但是在很多情况下,仅仅同步是不够的,还需要线程与线程协作(通信),生产者/消费者问题是一个经典的线程同步以及通信的案例。该问题描述了两个共享固定大小缓冲区的线程,即所谓的“生产者”和“消费者”在实际运行时会发生的问题。生产者的主要作用是生成一定量的数据放到缓冲区中,然后重复此过程。与此同时,消费者也在缓冲区消耗这些数据。该问题的关键就是要保证生转载 2017-03-28 11:07:25 · 479 阅读 · 0 评论 -
Java并发(一):线程安全与不安全、volatile、synchronized
最近在研究Java并发,发现了一个不错的并发专题,分享给各位。在学习它之前,一直认为Java并发是个很晦涩难以理解的东西。一是因为它的概念多而抽象,如果要真正理解某些原理可能要牵扯到一些底层的东西;二是因为它不好复现错误,每次运行的结果都不一样,可能某个bug(如死锁)在运行多次程序都能正常执行,但程序就是错误的,不知道哪一次运行就错了。所以要更好地理解Java并发,还是应该从基础说起,只有夯实了基转载 2017-03-28 09:50:06 · 769 阅读 · 0 评论 -
Effective Java读书笔记——第十章 并发
线程机制允许同时进行多个活动。本章阐述的建议可以帮助编写出清晰、正确、文档组织良好的并发程序。第66条:同步访问共享的可变数据关键字synchronized可以保证在同一时刻,只有一个线程可以执行某一个方法,或者某一个代码块。如果没有同步,一个线程的变化就不能被其他线程看到。同步不仅可以阻止一个线程看到对象处于不一致的状态之中。它还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的原创 2017-03-22 16:32:21 · 561 阅读 · 0 评论 -
Java 多线程同步的五种方法
转自微信公众号: Android开发中文站1、为什么要线程同步因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常。举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100.取钱成功了,账户余额是0转载 2017-03-02 18:29:27 · 232 阅读 · 0 评论 -
一张图读懂Java多线程
1、带着疑问看图1)竞争对象的锁和竞争CPU资源以及竞争被唤醒2)何种情况下获取到了锁,何种情况下会释放锁2、看图3、详细解读1)Thread t = new Thread(),初始化一个线程,实际上就是一个普通对象,此时他的状态为New2)t.start(); 线程处于就绪状态(可运行状态),也就是随时等待着运行, 不要小看这个start,这个start决定了他是否是一个真正的线程实例,因为sta转载 2017-03-02 18:01:23 · 281 阅读 · 0 评论