java 并发
文章平均质量分 93
Coding-lover
Keep hungry,Keep foolish(可通过微信联系我:unilay_yang)
展开
-
java 线程的创建与启动
一、进程与线程的区别:一个进程可以包括多个线程,每个进程都需要操作系统为其分配独立的内存地址空间,同一进程的所有线程在同一块地址空间中工作。二、JAVA线程的运行机制:在JAVA虚拟机进程中,执行程序代码的任务是由线程完成的,每个线程都有一个独立的程序计数器和方法调用栈(method invocation stack)。程序计数器也称PC寄存器,当线程执行一个方法时,程序计数器指向转载 2014-08-05 21:34:29 · 845 阅读 · 0 评论 -
java 线程的生命周期和状态控制
一、线程的生命周期线程状态转换图:1、新建状态用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。注意:不能对已经启动的线程再次调用start()方法,否则会出现java.lang.IllegalThreadStateExcep转载 2014-08-06 21:23:14 · 977 阅读 · 0 评论 -
java 线程Thread方法之suspend()和resume()
官方解释如下:http://download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveDeprecation.htmlWhy are Thread.suspend and Thread.resume deprecated? Thread.suspend is inherently dead转载 2014-08-07 19:27:27 · 1165 阅读 · 0 评论 -
java volatile深入内存详解
volatile的特性当我们声明共享变量为volatile后,对这个变量的读/写将会很特别。理解volatile特性的一个好方法是:把对volatile变量的单个读/写,看成是使用同一个监视器锁对这些单个读/写操作做了同步。下面我们通过具体的示例来说明,请看下面的示例代码:class VolatileFeaturesExample { volatile long vl = 0L转载 2014-08-08 22:19:49 · 811 阅读 · 0 评论 -
java CyclicBarrier使用
1、类说明:一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。2、使用场景:需要所有的子任务都完成时,才执行主任务,这个时候就转载 2014-08-10 11:11:03 · 571 阅读 · 0 评论 -
java 轻量级锁原理详解
大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意。原因是,Monitor Enter与Monitor Exit这两个控制多线程同步的Byte Code原语,是JVM依赖操作系统互斥(mutex)来实现的。互斥是一种会导致线程挂起,并在较短的时间内又需要重新调度回原线程的,较为消耗资源的操作。为了优化Java的Lock机制,从Java6开始引入了轻量级转载 2014-11-26 23:12:33 · 3083 阅读 · 0 评论 -
java 多线程suspend()、resume()和wait()、notify()的区别
suspend() 和 resume() 方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。但suspend()方转载 2014-08-07 19:29:50 · 1338 阅读 · 2 评论 -
java 线程间通信简介(wait/notify的应用)
线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号。例如,线程B可以等待线程A的一个信号,这个信号会通知线程B数据已经准备好了。本文将讲解以下几个JAVA线程间通信的主题:1、通过共享对象通信2、忙等待3、wait(),notify()和notifyAll()4、丢失的信号5、假唤醒6、多线程等待转载 2014-08-09 17:21:56 · 952 阅读 · 0 评论 -
java 线程等待与唤醒
概要本章,会对线程等待/唤醒方法进行介绍。涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long timeout)和notify()4. wait() 和 notifyAll()5. 为什么notify(), wait()等函数定义在Object中,而不是Thread中转载 2014-08-09 17:31:02 · 1499 阅读 · 0 评论 -
java 深入研究Synchronize 和 Lock 的区别与用法
在分布式开发中,锁是线程控制的重要途径。Java为此也提供了2种锁机制,synchronized和lock。做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方。 我们先从最简单的入手,逐步分析这2种的区别。 一、synchronized和lock的用法区别 synchronized:在需要同步的对象中加入此控制,synchronized转载 2014-08-10 23:09:52 · 925 阅读 · 0 评论 -
java 锁机制
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁); 如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻塞在锁池等待队列中)。 取到锁后,他就开始执行同步代码(被synchronized修饰的代码);线程执行完同步代码后马上就把锁还给同步对象,其他在锁池中等待的某个线程就可以拿到锁转载 2014-08-07 20:05:19 · 610 阅读 · 0 评论 -
java 几种线程池的实现分析
1. 前言在阅读研究线程池的源码之前,一直感觉线程池是一个框架中最高深的技术。研究后才发现,线程池的实现是如此精巧。本文从技术角度分析了线程池的本质原理和组成,同时分析了JDK、Jetty6、Jetty8、Tomcat的源码实现,对于想了解线程池本质、更好的使用线程池或者定制实现自己的线程池的业务场景具有一定指导意义。2. 使用线程池的意义复用:类似WEB服务器等系统,长期转载 2014-12-15 00:54:59 · 762 阅读 · 0 评论 -
java 线程生命周期
与人有生老病死一样,线程也同样要经历开始(等待)、运行、挂起和停止四种不同的状态。这四种状态都可以通过Thread类中的方法进行控制。下面给出了Thread类中和这四种状态相关的方法。 // 开始线程 public void start( ); public void run( ); // 挂起和唤醒线程 public转载 2014-08-05 22:59:37 · 883 阅读 · 0 评论 -
java SE1.6中的Synchronized原理
1 引言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。2 术语定义术语转载 2014-12-14 10:58:20 · 646 阅读 · 0 评论 -
java 多线程
线程的概念:程序 进程与线程的区别: 程序是一个静态的代码或者说静态的存在.而进程是程序的一次运行过程. 多个进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,有可能互相影响. 线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担要小。线程的实现方法:继承Thread类原创 2014-03-21 16:27:39 · 1377 阅读 · 0 评论 -
java sleep()和wait()的区别
通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程 downloadThread将该图片下载完毕。如果图片还没有下载完,displayThread可以暂停,当downloadThread完成了任务后,再通知displayThread“图片准备完毕,可以显示了”,这时,displayThread继续执行。以上逻辑简单的转载 2014-08-07 23:28:32 · 856 阅读 · 0 评论 -
java volatile详解
用在多线程,同步变量。 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A) =========================分割线1===========转载 2014-08-08 22:38:31 · 583 阅读 · 0 评论 -
java CountDownLatch使用
CountDownLatch1、类介绍一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重转载 2014-08-10 11:05:47 · 627 阅读 · 0 评论 -
java 一个简单的线程池
本文给大家介绍一个简单的线程池的实现过程,方便大家对线程池的理解。ThreadPool类如下:public class ThreadPool{ static int MAX_THREAD = 1000; static int MIN_THREAD = 14; static int id = 1; //线程 ID 号,主要用于监视线程的工作情况 st转载 2014-11-19 10:11:34 · 661 阅读 · 0 评论 -
java 多线程进阶
一、线程的实现二、不得不提的[ThreadLocal]三、线程的同步与锁四、线程的调度五、阻塞队列六、线程池主题:多线程进阶多线程的一些核心内容以及要关注的细节。一、线程的实现继承thread类重写run()方法和实现Runnable接口实现run()方法注意点:new线程实例时建议加线程名和要处理下线程的中断异常([Interrupte转载 2014-11-30 22:52:23 · 784 阅读 · 0 评论 -
java Thread Dump 日志分析
jstack Dump 日志文件中的线程状态dump 文件里,值得关注的线程状态有:死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on monitor entry(重点关注)暂停,Suspended对象等待中,Object.wait() 或 TIM转载 2015-02-28 18:17:29 · 829 阅读 · 0 评论 -
java Semaphore
一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动。拿到信号量的线程可以进入代码,否则就等待。通过acquire()和release()获取和释放访问许可转载 2014-08-10 11:15:50 · 587 阅读 · 0 评论 -
java ReentrantLock可重入锁的使用场景
摘要从使用场景的角度出发来介绍对ReentrantLock的使用,相对来说容易理解一些。场景1:如果发现该操作已经在执行中则不再执行(有状态执行)a、用在定时任务时,如果任务执行时间可能超过下次计划执行时间,确保该有状态任务只有一个正在执行,忽略重复触发。b、用在界面交互时点击执行较长时间请求操作时,防止多次点击导致后台重复执行(忽略重复触发)。以上两种情况多用转载 2014-08-10 22:45:08 · 2337 阅读 · 0 评论 -
java Callable与Future:从任务中产生返回值
Future模式Future接口是Java线程Future模式的实现,可以来进行异步计算。Future模式可以这样来描述:我有一个任务,提交给了Future,Future替我完成这个任务。期间我自己可以去做任何想做的事情。一段时间之后,我就便可以从Future那儿取出结果。就相当于下了一张订货单,一段时间后可以拿着提订单来提货,这期间可以干别的任何事情。其中Fu转载 2014-08-11 22:47:18 · 1670 阅读 · 0 评论 -
java TimeUnit vs Thread.sleep的用法对比
TimeUnit是java.util.concurrent包下面的一个类,TimeUnit提供了可读性更好的线程暂停操作,通常用来替换Thread.sleep()。在很长一段时间里Thread的sleep()方法作为暂停线程的标准方式,几乎所有Java程序员都熟悉它。Thread.sleep()是一个静态方法,暂停线程时它不会释放锁,该方法会抛出InterrupttedException异常(如果转载 2014-10-10 09:49:33 · 3998 阅读 · 0 评论 -
java 关于System.out.println的多线程并发问题
如果println函数的参数为常量则不会出现线程并发问题,但是如果参数为表达式形式,则JVM在执行println函数的时候会分为几步来执行,从而造成并发问题。如下例子所示:public class Test{ public static void main(String[] args) { ExecutorService pool = Executors.newFixedThre转载 2014-10-20 20:01:30 · 1990 阅读 · 0 评论 -
java Thread源码分析
1、Runnable接口源码:转载 2014-08-03 22:12:04 · 951 阅读 · 0 评论 -
java ReentrantLock与synchronized详细分析与例子详解
关于互斥锁:所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. 而现在, Lock提供了比synchronized机制更广泛的锁定操作, Lock和synchronized机制的主要区别:synchronized机制提供了对与每个对象相关的隐式监视器锁的访问, 并强制所有锁获取和释放均要转载 2014-08-10 23:23:57 · 1768 阅读 · 0 评论 -
java 线程组简介
线程组是Java线程编程所持有的概念。在Java中,线程组是指java.lang.ThreadGroup类的对象,每个线程都隶属于唯一的一个线程组,这个线程组在线程创建时指定并在线程的整个生命周期内都不能更改。可以通过调用包含ThreadGroup类型参数的Thread类构造方法来指定线程所属线程组。若没有指定,则线程默认的隶属于名为main的系统线程组。除了预建的系统线程外,所以线程组都必须显式转载 2014-11-24 22:19:01 · 712 阅读 · 0 评论 -
java 内存模型与线程
Java线程之间的通信由Java内存模型(简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来 看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(mainmemory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存转载 2014-07-03 21:30:26 · 686 阅读 · 0 评论 -
java final总结
遵守两个重排序规则: 1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。写final域的重排序规则 写final域的重排序规则禁止把final域的写重排序到构造函数之外。这个规则的实现包含下面2个方面: JMM禁止编译器把fi原创 2015-03-25 11:52:25 · 1233 阅读 · 0 评论 -
java 线程封闭
线程封闭实现好的并发是一件困难的事情,所以很多时候我们都想躲避并发。避免并发最简单的方法就是线程封闭。什么是线程封闭呢? 就是把对象封装到一个线程里,只有这一个线程能看到此对象。那么这个对象就算不是线程安全的也不会出现任何安全问题。实现线程封闭有哪些方法呢?1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的线程封闭完全靠实现者实现。也是最糟糕的一种线程封闭。所以我们直接把他忽略掉吧。转载 2015-03-25 14:22:04 · 593 阅读 · 0 评论 -
深入理解Java内存模型(六)——final
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问。对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面,我们通过一些示例性的代码来分别说转载 2015-03-25 11:26:59 · 465 阅读 · 0 评论 -
深入理解Java内存模型(五)——锁
锁的释放-获取建立的happens before 关系锁是java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。下面是锁释放-获取的示例代码:class MonitorExample { int a = 0; public synchronized void writer() { //1转载 2015-03-25 21:50:42 · 564 阅读 · 0 评论 -
java ThreadLocal(应用场景及使用方式及原理)
Thread.java源码中:ThreadLocal.ThreadLocalMap threadLocals = null;即:每个Thread对象都有一个ThreadLocal.ThreadLocalMap成员变量,ThreadLocal.ThreadLocalMap是一个ThreadLocal类的静态内部类(如下所示),所以Thread类可以进行引用.static class Th转载 2014-07-30 10:15:12 · 19946 阅读 · 1 评论 -
java synchronized的深刻认识
JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。假如再细的分类,synchronized可作用于instance变量、object reference(对象引用,例如this)、static函数和class literals(类名称字面常量)身上。下面讨论synchronized用到不同地方对代码产生的影响:假设P1、P2转载 2014-08-03 15:06:26 · 1015 阅读 · 0 评论 -
聊聊并发(二)Java SE1.6中的Synchronized
1 引言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。2 术语定义术语英文转载 2015-03-26 23:37:20 · 657 阅读 · 0 评论 -
悲观锁和乐观锁
悲观锁【Pessimistic Locking】顾名思义就是采用一种悲观的态度来对待事务并发问题,我们认为系统中的并发更新会非常频繁,并且事务失败了以后重来的开销很大,这样以来,我们就需要采用真正意义上的锁来进行实现。悲观锁的基本思想就是每次一个事务读取某一条记录后,就会把这条记录锁住,这样其它的事务要想更新,必须等以前的事务提交或者回滚解除锁。 假如我们数据库事务的隔转载 2015-03-27 15:37:31 · 666 阅读 · 0 评论 -
java 内存模型 指南(Recipes)
单处理器(Uniprocessors)如果能保证正在生成的代码只会运行在单个处理器上,那就可以跳过本节的其余部分。因为单处理器保持着明显的顺序一致性,除非对象内存以某种方式与可异步访问的IO内存共享,否则永远都不需要插入屏障指令。采用了特殊映射的java.nio buffers可能会出现这种情况,但也许只会影响内部的JVM支持代码,而不会影响Java代码。而且,可以想象,如果上下文切换时不转载 2014-12-16 09:11:17 · 609 阅读 · 0 评论 -
同步与Java内存模型(原子性,可见性,有序性)
同步与Java内存模型(一)序言先来看如下这个简单的Java类,该类中并没有使用任何的同步。final class SetCheck { private int a = 0; private long b = 0; void set() { a = 1; b = -1; } boolean check() { r转载 2015-03-27 22:09:55 · 3152 阅读 · 0 评论