
java多线程
文章平均质量分 77
wjxbj
这个作者很懒,什么都没留下…
展开
-
什么时候使用CountDownLatch
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在Java并发中,countdownlatch的概念是一个常见的面试题,所以一定要确保你很好的理解了它。在这篇文章中,我将会涉及到在Java并发编 程中跟CountDownLatch相关的以下几点。一.CountDownLatch是...原创 2017-02-21 22:49:33 · 188 阅读 · 0 评论 -
Java多线程之CountDownLatch使用
CountDownLatch一.类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。...原创 2015-07-29 20:34:54 · 191 阅读 · 0 评论 -
ThreadLocal与线程安全
首先来看一下线程安全问题产生的两个前提条件: 1.数据共享,多个线程访问同样的数据。 2.共享数据是可变的,多个线程对访问的共享数据作出了修改。 实例: 定义一个共享数据:public static int a = 0; 多线程对该共享数据进行修改: private static void plus() { for (in...原创 2014-04-04 21:27:09 · 120 阅读 · 0 评论 -
[转]ConcurrentHashMap Collections.synchronizedMap和Hashtable讨论
在Java类库中出现的第一个关联的集合类是Hashtable,它是JDK1.0的一部分。 Hashtable提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的――Hashtable的所有方法都是同步的。此时,无竞争的同步会导致可观的性能代价。Hashtable的后继者HashMap是作为JDK1.2中的集合框架的一部分出现的,它通过提供一个不同...原创 2013-05-28 12:49:13 · 94 阅读 · 0 评论 -
一个验证HashMap在多线程环境下线程不安全的例子及dump分析
实例: package com.bijian.study.hashmap;import java.util.HashMap;public class TestLock { private HashMap map = new HashMap(); public TestLock() { Thread t1 = new Thread() { pub...原创 2013-05-27 13:27:00 · 1070 阅读 · 0 评论 -
单例模式中的多线程分析
谈到单例模式,我们立马会想到饿汉式和懒汉式加载,所谓饿汉式就是在创建类时就创建好了实例,懒汉式在获取实例时才去创建实例,即延迟加载。饿汉式:package com.bijian.study;public class Singleton { private Singleton() { } // 注意这是private 只供内部调用 private stat...原创 2013-05-27 13:26:17 · 116 阅读 · 0 评论 -
多线程编程一般规则
如果两个工两个以上的线程都修改一个对象,那么把执行修改的方法定义为被同步的,如果对象更新影响到只读方法,那么只读方法也要定义成同步的。 不要滥用同步。如果在一个对象内的不同的方法访问的不是同一个数据,就不要将方法设置为synchronized的。 如果一个线程必须等待一个对象状态发生变化,那么他应该在对象内部等待,而不是在外部。他可以通过调用一个被...原创 2013-05-27 13:02:27 · 175 阅读 · 0 评论 -
线程组
有些程序包含了相当数量的线程。这时,如果按照线程的功能将他们分成不同的类别将很有用。 线程组可以用来同时对一组线程进行操作。 创建线程组:ThreadGroup g = new ThreadGroup(groupName); 将各个线程添加给该线程组:Thread t = new Thread(g,threadName); 要中断...原创 2013-05-27 13:01:16 · 95 阅读 · 0 评论 -
线程优先级
多线程运行时需要定义线程运行的先后顺序。线程优先级是用数字表示,数字越大线程优先级越高,取值在1到10,默认优先级为5。实例:package com.bijian.study;/** * 因为在代码段当中把线程B的优先级设置高于线程A,所以运行结果先执行线程B的run()方法后再执行线程A的run()方法 * 但在实际中,JAVA的优先级不准,强烈不建议用此方法来控...原创 2013-05-27 13:00:06 · 130 阅读 · 0 评论 -
线程的调度
1. Java提供一个线程调度程序来监控程序中启动后进入可运行状态的所有线程。线程调度程序按照线程的优先级决定应调度哪些线程来执行。 2. 多数线程的调度是抢占式的(即我想中断程序运行就中断,不需要和将被中断的程序协商)a) 时间片方式(time slicing)b) 非时间片方式 3. 下面几种情况下,...原创 2013-05-25 16:33:52 · 109 阅读 · 0 评论 -
java多线程之Semaphore使用
本文将介绍用来控制资源同时访问个数的Semaphore工具类,然后采用Semaphore给出一个泊车的实例,最后给出Semaphore和CountDownLatch的几点比较。一. Semaphore工具类介绍/** * A counting semaphore. Conceptually, a semaphore maintains a set of * p...原创 2015-07-29 20:57:18 · 279 阅读 · 0 评论 -
浅识volatile
volatile是一个被遗忘的关键字,在开发串行程序当中不会使用,而并行程序当中也不能代替锁(synchronized)(大多数情况下)。但开发当中若然巧妙使用volatile,将避免不必要的加锁操作。 在并行程序开发当中操作变量需要注意两个问题.一个是安全性(正确性),另一个是内存可见性。当多个线程同时操作一个变量时,可以使用锁来保证操作变量的安全性和内存可...2015-07-31 19:29:32 · 105 阅读 · 0 评论 -
ExecutorService线程池
一.ExecutorService 建立多线程的步骤1.定义线程类class Handler implements Runnable{}2.建立ExecutorService线程池ExecutorService executorService = Executors.newCachedThreadPool();或者int cpuNums = Runtime.getR...原创 2016-06-28 09:19:00 · 89 阅读 · 0 评论 -
对象锁和块锁
昨天测试同事测出一BUG,经分析是并发的问题,于是速速的加synchronized(this)提交,如下所示: 可测试发现,我的synchronized根本不起作用。经分析,这里没有生效的原因是:每次请求过来,我都往线程池中submit一个匿名的实例(即new Runnable(){...}每次都是新建实例),而synchronized(this)锁住的是对象...2017-01-24 15:19:13 · 130 阅读 · 0 评论 -
Java Thread join() 的用法
Java Thread中, join() 方法主要是让调用该方法的thread完成run方法里面的东西后,再执行join()方法后面的代码。示例:package com.bijian.study;class ThreadTesterA implements Runnable { private int counter; @Override...原创 2016-03-21 20:08:29 · 147 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述v...原创 2016-03-18 23:39:02 · 121 阅读 · 0 评论 -
线程池实例:使用Executors和ThreadPoolExecutor
线程池负责管理工作线程,包含一个等待执行的任务队列。线程池的任务队列是一个Runnable集合,工作线程负责从任务队列中取出并执行Runnable对象。 java.util.concurrent.executors 提供了 java.util.concurrent.executor 接口的一个Java实现,可以创建线程池。下面是一个简单示例: ...原创 2016-03-18 23:26:19 · 520 阅读 · 0 评论 -
深入剖析ThreadLocal
想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理。首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两个应用场景。一.对ThreadLocal的理解 ThreadLocal,很多地方叫做线程本地变量,也有些地方...原创 2016-03-07 20:50:54 · 1382 阅读 · 0 评论 -
ExecutorService对象的shutdown()和shutdownNow()的区别
从上篇文章的实例中,我们用了ExecutorService的shutdown方法,但我们不难发现它还有shutdownNow方法,它们到底有什么区别呢? 这两个方法都可以关闭 ExecutorService,这将导致其拒绝新任务。shutdown() 方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行...原创 2016-03-07 19:48:50 · 196 阅读 · 0 评论 -
Callable与Future的介绍
Callable与 Future 两功能是Java在后续版本中为了适应多并法才加入的,Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其他线程执行的任务。 Callable的接口定义如下:public interface Callable<V> { V call()...原创 2016-03-07 19:45:14 · 87 阅读 · 0 评论 -
java并发工具包
一.并发工具概述 1.传统的多线程并没有提供高级特性,例如:信号量、线程池和执行管理器等,而这些特性恰恰有助于创建强大的并发程序。 2.新的Fork/Join框架针对当前的多核系统,也提供了并行编程的可行性。 3.并发工具包处理于java.util.concurrent包,主要包括同步器、执行顺、并发集合、Fork/Join框架、atomi...原创 2015-11-22 23:34:15 · 169 阅读 · 0 评论 -
ThreadPoolExecutor使用介绍
一.简介线程池类为java.util.concurrent.ThreadPoolExecutor1.常用构造方法ThreadPoolExecutor(int corePoolSize, int maximumPoolSize,long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, Rej...原创 2016-06-28 09:56:59 · 93 阅读 · 0 评论 -
Java多线程入门
一.线程的概念模型a.虚拟的CPU,由java.lang.Thread类封装和虚拟b.CPU所执行的代码,传递给Thread类对象c.CPU所处理的数据,传递给Thread类对象 二.线程体Java的线程是通过java.lang.Thread类来实现的每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体(即...原创 2013-05-25 16:22:20 · 124 阅读 · 0 评论 -
线程的状态
1.线程共有下面4种状态:a. new(新建):当你用new创建一个线程时,该线程尚未运行。b. runnable(可运行):一旦调用了start方法,该线程便是一个可运行的线程。可运行的线程可以尚未执行,也可以正在执行,取决于线程调度的结果。(JAVA文档并不将正在运行的情况视为一个专门的状态)c. blocked(被中断运行):当出现下列操作...原创 2013-05-25 12:35:08 · 115 阅读 · 0 评论 -
深入学习Thread类
一. 线程的名字下面来看一下Thread类的name属性,它的类型是String。它其实就是线程的名字。在Thread类中,有String getName()和void setName(String)两个方法用来设置和获取这个属性的值。同时,Thread类还提供相应的构造方法,让Thread类的对象在创建的时候就有一个名字。构造方法如下:a.Thread(S...原创 2013-05-25 12:28:04 · 116 阅读 · 0 评论 -
threadLocal实例
实例1:package com.bijian.thread;public class MyThread extends Thread { private static ThreadLocal tl = new ThreadLocal() { protected synchronized Object initialValue() { return new In...原创 2013-05-20 11:42:23 · 115 阅读 · 0 评论 -
简单生产消费者问题
生产者-消费者问题a. 在多线程程序中,可能出现生产者-消费者问题,即等待同步数据的问题 b. 可能出现的问题: a) 生产者比消费者快时,消费者会漏掉一些数据没有取到 b) 消费者比生产者快时,消费者取相同的数据c. notify()和wait()方法用来协调读取的关系...原创 2013-05-19 15:04:51 · 118 阅读 · 0 评论 -
wait-notify机制
wait-notify机制a. 当synchronized方法中的wait方法被调用时,当前线程将被中断运行,并且放弃该对象的锁b. 一旦线程调用了wait方法,它便进入该对象的等待列表。要从等待列表中删除该线程,使它有机会继续运行,其它线程必须调用同一个对象上的notify或者notifyAll方法c. 当线程再次成为可运行的线程后,它们便试图...原创 2013-05-19 15:01:04 · 88 阅读 · 0 评论 -
synchronized同步块实例
synchronized同步块实例 在java中,每个对象都包含了一把锁(也叫做“监视器”),它自动成为对象的一部分(不必为此写任何特殊的代码)。在给定时刻,只有一个线程可以拥有一个对象的监视器。 示例:线程1进入withdrawal方法时,获得监视器(加锁);当线程1的方法执行完毕返回时,释放监视器(开锁),线程2的withdrawal方能进入 ...原创 2013-05-19 14:58:30 · 136 阅读 · 0 评论 -
Runnable接口使用实例
Runnable接口a. 该接口只有一个方法:public void run();b. 实现该接口的类必须覆盖该run方法c. 实现了Runnable接口的类并不具有任何天生的线程处理能力,这与那些从Thread类继承的类是不同的d. 为了从一个Runnable对象产生线程,必须再单独创建一个线程对象,并把Runnable对象传递...原创 2013-05-19 14:55:14 · 365 阅读 · 0 评论 -
守护线程
什么是守护线程a. 在客户/服务器模式下,服务器的作用是等待用户发来请求,并按请求完成客户的工作b. 守护线程是为其它线程提供服务的线程,如定时器线程c. 守护线程一般应该是一个独立的线程,它的run()方法是一个无限循环d. 守护线程与其它线程的区别是:如果守护线程是唯一运行着的线程,程序会自动退出e. 把线程变...原创 2013-05-19 14:53:26 · 128 阅读 · 0 评论 -
java多线程join的作用与用法
对于JAVA的join,JDK 是这样说的:join public final void join (long millis )throws InterruptedException Waits at most millis milliseconds for this thread to die. A timeout of 0 means to wait forever。字面意...原创 2013-04-02 21:01:18 · 251 阅读 · 0 评论 -
守护线程概念及实例
守护线程在没有用户线程可服务时自动离开,在Java中比较特殊的线程是被称为守护(Daemon)线程的低级别线程。这个线程具有最低的优先级,用于为系统中的其它对象和线程提供服务。 将一个用户线程设置为守护线程的方式是在线程对象创建之前调用线程对象的setDaemon方法。典型的守护线程例子是JVM中的系统资源自动回收线程,我们所熟悉的Java垃圾回收线程就是一个典型的守护线程,...原创 2013-03-26 20:08:34 · 130 阅读 · 0 评论 -
java的wait与notify
wait与notify是java同步机制中重要的组成部分。结合与synchronized关键字使用,可以建立很多优秀的同步模型。 synchronized(this){}等价与public synchronized void method(){.....} 同步分为类级别和对象级别,分别对应着类锁和对象锁。类锁是每个类只有一个,如果static的方法被s...原创 2013-03-26 17:14:37 · 119 阅读 · 0 评论 -
JDK1.5 Lock实例
JDK1.5 Lock实例 Executors类主要方法:a. static ExecutorService newCachedThreadPool()产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用b. static ExecutorServi...原创 2013-05-20 11:42:46 · 123 阅读 · 0 评论 -
JDK1.5 returnvalue实例
Callable接口:返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。 ExecutorService接口方法: <T> Future&...原创 2013-05-20 11:43:08 · 92 阅读 · 0 评论 -
JDK1.5 线程池
Executors类主要方法:a. static ExecutorService newCachedThreadPool()产生一个ExecutorService对象,这个对象带有一个线程池,线程池的大小会根据需要调整,线程执行完任务后返回线程池,供执行下一次任务使用b. static ExecutorService newFixedThread...原创 2013-05-20 13:26:28 · 142 阅读 · 0 评论 -
多线程基础知识
一.进程和线程进程就是一个在内存中独立运行的程序,有自己的地址空间。如正在运行的写字板程序就是一个进程。“多任务”:指操作系统能同时运行多个进程(程序)。如WINDOWS系统可以同时运行写字板程序、画图程序、WORD、Eclipse等。线程:是进程内部单一的一个顺序控制流。线程和进程a. 每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。b....原创 2013-05-25 12:25:55 · 102 阅读 · 0 评论 -
解决SimpleDateFormat的线程不安全问题的方法
在Java项目中,我们通常会自己写一个DateUtil类,处理日期和字符串的转换,如下所示:public class DateUtil01 { private SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public void format(Date date) {...原创 2013-05-22 13:44:35 · 178 阅读 · 0 评论 -
简单模拟实现数据库连接池
简单模拟实现数据库连接池实例1:package com.bijian.thread;public class DB { //private static final int MAX_COUNT = 10; private static final DB instance = new DB(); private int count = 0; private...原创 2013-05-22 10:04:50 · 294 阅读 · 0 评论