随笔分类 - 并发和多线程
并发
摘要:Java的线程池一般是基于concurrent包下的ThreadPoolExecutor类实现的, 不过当我们基于spring框架开发程序时, 通常会使用其包装类ThreadPoolTaskExecutor, 这里有一个小问题就是当使用线程池执行任务的时候, 任务的消费速度小于生产速度时,任务通常会
阅读全文
摘要:前言 学习了一段时间J.U.C,打算做个小结,个人感觉总结还是非常重要,要不然总感觉知识点零零散散的。 有错误也欢迎指正,大家共同进步; 另外,转载请注明链接,写篇文章不容易啊,http://www.cnblogs.com/chenpi/p/5614290.html JSR 166及J.U.C 什么
阅读全文
摘要:看了下Java Tutorials中的fork/join章节,整理下。 什么是fork/join框架 fork/join框架是ExecutorService接口的一个实现,可以帮助开发人员充分利用多核处理器的优势,编写出并行执行的程序,提高应用程序的性能;设计的目的是为了处理那些可以被递归拆分的任务
阅读全文
摘要:如果你想避免使用错综复杂的wait–notify的语句,BlockingQueue非常有用。BlockingQueue可用于解决生产者-消费者问题,如下代码示例。对于每个开发人员来说,生产者消费者问题已经非常熟悉了,这里我将不做详细描述。 为什么BlockingQueue适合解决生产者消费者问题 任
阅读全文
摘要:面试问题: 下面的方法是否线程安全?怎样让它成为线程安全的方法? 本篇文章将解释一个常见的面试题,该问题被谷歌和很多其它公司问起过。它涉及的相对比较初级,而不是关于怎样去设计复杂的并发程序。 首先,这个问题的答案是No,因为counter++操作不是一个原子操作,而是由多个原子操作组成。 举个例子,
阅读全文
摘要:这是一个展示如何使用join()方法的例子。 问题: 使用Java多线程计算表达式1*2/(1+2)的值。 解决方案: 使用一个线程做加法运算,另一个线程做乘法运算,还有一个主线程main做除法运算。由于线程之间不需要通讯,所以我们只需要考虑线程的执行顺序。 在main线程中,我们让加法运算线程和乘
阅读全文
摘要:Atomic包的作用 方便程序员在多线程环境下,无锁的进行原子操作 Atomic包核心 Atomic包里的类基本都是使用Unsafe实现的包装类,核心操作是CAS原子操作; 关于CAS compare and swap,比较和替换技术,将预期值与当前变量的值比较(compare),如果相等则使用新值
阅读全文
摘要:写在前面 同步工具类主要包括闭锁(如CountDownLatch),栅栏(如CyclicBarrier),信号量(如Semaphore)和阻塞队列(如LinkedBlockingQueue)等; 使用同步工具类可以协调线程的控制流; 同步工具类封装了一些状态,这些状态决定线程是继续执行还是等待,此外
阅读全文
摘要:AtomicInteger源码 在java.util.concurrent.atomic包下提供了大量的原子类,这里以AtomicInteger源码为例,添加了一些注释,个人理解,供参考; 其中比较重要的一个概念是CAS操作,现代CPU已广泛支持,在JDK的AtomicInteger类中是调用了Un
阅读全文
摘要:同步容器类 同步容器类的创建 在早期的JDK中,有两种现成的实现,Vector和Hashtable,可以直接new对象获取; 在JDK1.2中,引入了同步封装类,可以由Collections.synchronizedXxxx等方法创建; 同步容器类的问题 同步容器类虽然都是线程安全的,但是在某些情况
阅读全文
摘要:线程状态 新建状态 线程被创建时,会短暂的处于这种状态。处于这种状态的线程已经分配了必须的系统资源,有资格获得cpu时间了,等待调度器把它转变为可运行状态或阻塞状态; 就绪状态 在这种状态下,只要调度器把时间片分配给线程,就可以马上运行; 阻塞状态 线程因为某个条件未满足,阻止了它的运行;这种状态会
阅读全文
摘要:什么是共享资源 先了解下JAVA程序在运行时内存的分布,由以下部分组成 注意上面标红的堆和方法区的数据,是多个线程的共享的资源,会出现多个线程访问共享资源的情况;如多个线程访问同一个对象的成员变量,多个线程访问静态全局变量等... 多个线程不正确的访问共享资源 举个例子,多个线程访问同一个对象的情况
阅读全文
摘要:基本线程机制 一个程序可以被划分为多个独立的任务,每个独立的任务可以由线程来驱动执行; 一个进程可以包含若干个线程,即拥有若干个并发执行的任务,在程序运行时,CPU时间被划分成片段分配给所有的线程; 在单处理器的机器上使用多线程可以提高性能的原因在于任务阻塞; 为机器增加处理器可以显著加快使用多线程
阅读全文
摘要:一、前言 最近在工作上用到了一个静态方法,跟同事交流的时候,被一个问题给问倒了,只怪基础不扎实... 问题大致是这样的,“在多线程环境下,静态方法中的局部变量会不会被其它线程给污染掉?”; 我当时的想法:方法中的局部变量在运行的时候,是存在JAVA栈中的,方法运行结束,局部变量也就都弹光了,理论上单
阅读全文
