并发
光与热
这个作者很懒,什么都没留下…
展开
-
Time schedule和scheduleAtFixedRate区别
[java] view plain copy print?schedule和scheduleAtFixedRate的区别在于,如果指定开始执行的时间在当前系统运行时间之前,scheduleAtFixedRate会把已经过去的时间也作为周期执行,而schedule不会把过去的时间算上。 比如 SimpleDateFormat fTime = new SimpleDateFormat(“yyyy/M转载 2017-01-14 14:27:40 · 1135 阅读 · 0 评论 -
线程同步工具之CountDownLatch示例
本文是学习网络上的文章时的总结,感谢大家无私的分享。CountDownLatch的一个非常典型的应用场景是:有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。假如我们这个想要继续往下执行的任务调用一个CountDownLatch对象的await()方法,其他的任务执行完自己的任务后调用同一个CountDownLatch对象上的countDown()方法,这个调用await转载 2017-08-07 16:57:57 · 318 阅读 · 0 评论 -
java编程思想笔记-并发之CyclicBarrier
CyclicBarrier和CountDownLatch类似,可以让一组任务并行的工作,然后在下一个步骤之前等待,直至所有的任务完成,但是CountDownLatch只触发一次事件,而CyclicBarrier可以多次重用示例: 赛马游戏class Horse implements Runnable{ private static int counter=0; //赛马id原创 2017-08-12 14:31:42 · 433 阅读 · 0 评论 -
BlockingQueue的各种实现队列
一、什么是BlockingQueueBlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种:1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空队列进行出队列操作时,它将转载 2017-08-12 16:11:51 · 594 阅读 · 0 评论 -
java编程思想笔记-并发之DelayQueue和PriorityBlockingQueue
DelayQueue是无界的BlockingQueue,用于防止实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走,这种队列是有序的且队头对象的延迟到期的时间越长。如果没有任何的延迟到期就不会有头元素,并且poll()将返回null 示例:class DelayedTask implements Runnable ,Delayed{ private static in原创 2017-08-12 18:02:45 · 459 阅读 · 0 评论 -
并发编程设计模式--Immutable Object
传统并发编程的问题: 锁的引入会带来很多的问题,如线程上下文切换开销,以及使编程本身变得复杂Immutable Object设计模式核心: 使用对外可见但的状态不可变的对象,使得对象天生具有线程安全性,而无需额外的同步控制问题: 什么是状态不可变的对象?1.类本身使用final修饰,防止子类修改定义的行为 2.所有字段都使用final修饰,保证字段值不可更改,并且被其它对象可见时必定是初始化原创 2017-08-27 09:46:32 · 417 阅读 · 0 评论 -
synchronize关键字互斥
当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。一个对象只有一个锁。所以,如果一个线程获得该锁,就没有其他线程可以获得锁,直到第一个线程释放(或返回)锁。这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放这样讲有点抽象看原创 2017-11-11 21:33:44 · 470 阅读 · 0 评论 -
java编程思想笔记-并发之CountDownLatch
CountDownLatch使用简介1.CountDownLatch用来同步一个或者多个任务,强制它们等待由其他任务执行的一组操作 2.CountDownLatch设定的初始值只能设置一次,不能重置,使用countDown()来减小这个值,如果希望这个值可以被重置可以使用CycliBarrierCountDownLatch使用示例class TaskPortion implements Runna原创 2017-08-11 20:02:30 · 513 阅读 · 0 评论 -
ThreadLocal使用及源码解读
ThreadLocal是什么 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的原创 2017-01-20 16:20:47 · 384 阅读 · 0 评论 -
java8 - fork-join之CompletableFuture 使用总结
CompletableFuture类实现了CompletionStage和Future接口。Future是Java 5添加的类,用来描述一个异步计算的结果,但是获取一个结果时方法较少,要么通过轮询isDone,确认完成后,调用get()获取值,要么调用get()设置一个超时时间。但是这个get()方法会阻塞住调用线程,这种阻塞的方式显然和我们的异步编程的初衷相违背。 为了解决这个问题,JDK吸收了原创 2017-12-20 19:00:03 · 2832 阅读 · 0 评论 -
对volatile关键字的理解
问题来源于编码规范的一个例子一. 关于server模式下的主存和工作内存 规则40 多线程访问同一个可变变量,需增加同步机制说明:根据Java Language Specification中对Java内存模型的定义, JVM中存在一个主内存(Java Heap Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每个线程都有自己的工作内存(Working Memo原创 2017-08-11 20:03:52 · 730 阅读 · 0 评论 -
java线程中断机制
1.线程进入阻塞状态有如下几个原因1.通过sleep使任务进入休眠状态 2.notify或notifyAll之前的被wait挂起的线程 3.任务在等待输入/输出 4.等待并发锁2.中断阻塞任务中断线程有两种方式: 1.调用希望被终止的线程的interrupt()方法 通过Thread.interrupt()方法终止被阻塞的任务,类如被wait,join,sleep等会抛出Interrupt原创 2017-08-09 22:32:38 · 670 阅读 · 0 评论 -
ReentrantLock的一个问题
今天在回顾java并发编程时遇到一个问题,有点奇怪 代码如下class BlockMutex { private Lock lock = new ReentrantLock(); public BlockMutex() { lock.lock(); } public void f(String name) { lock.lock();原创 2017-12-04 18:36:17 · 385 阅读 · 0 评论 -
ThreadGroup解读
ThreadGroup是位于java.lang包下的一个类,用于统一的线程管理.一旦一个线程加入到一个线程组后,就不能更换线程所在的线程组将当前线程加入到线程组中Thread thread = new Thread(threadGroup, new MyThread(), "threadname-" + i);通过重写uncaughtException方法捕获异常ThreadGroup thread原创 2017-12-15 12:10:08 · 2021 阅读 · 0 评论 -
线程池初探
1. 线程池存在的问题1.提交到线程池的任务避免依赖于其他的任务,否则对线程池的执行策略带来了约束,出现活跃度的问题 2.对于时间敏感的操作,比如GUI应用,将一个长时间运行的任务提交到单线程话的Exuctor中,或者将多个长时间运行的任务提交到只包含少量线程的线程池中或削弱Executor管理的服务的响应性 3.不应该在线程池中使用ThreadLocal变量当线程池都是同类的,独立的时候线程池原创 2017-08-18 17:43:17 · 533 阅读 · 0 评论 -
深入理解Lock
Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也应该是一个对象。两个线程执行的代码片段要实现同步互斥的效果,它们必须用同一个Lock对象。 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且转载 2017-07-31 09:56:05 · 534 阅读 · 0 评论 -
深入理解AQS
一、什么是同步器多线程并发的执行,之间通过某种 共享 状态来同步,只有当状态满足 xxxx 条件,才能触发线程执行 xxxx 。这个共同的语义可以称之为同步器。可以认为以上所有的锁机制都可以基于同步器定制来实现的。而juc(java.util.concurrent)里的思想是 将这些场景抽象出来的语义通过统一的同步框架来支持。juc 里所有的这些锁机制都是基于 AQS ( AbstractQue转载 2018-01-05 10:22:39 · 591 阅读 · 0 评论 -
java编程思想笔记-并发之死锁
以下四个条件同时满足时,就会发生死锁 1)互斥条件。任务使用的资源中至少有一个不能共享,如哲学家就餐问题的筷子一次只能一个哲学家使用 2)至少有一个任务它必须持有一个资源且正在等待获取一个当前被别的任务持有的资源 3)资源不能被任务抢占,任务必须把资源释放当做普通事件 4)循环等待,一个任务等待其它任务所持有的资源,后者又在等待另一个任务所持有的资源,直到有一个任务在等待一个任务所持有的资源原创 2017-08-11 13:51:53 · 626 阅读 · 0 评论 -
java编程思想笔记-并发之线程协作(四)
生产者,消费者队列wait()和notifyAll()方法以每次交互握手的方式解决任务操作问题,concurrent类库使用BlockingQueue同步队列来解决任务的协作问题,同步队列在任何时刻只允许一个任务插入或者移除元素,这个接口有两个常用的实现LinkedBlockingQueue和ArrayBlockingQueue,前者是无界队列,后者具有固定的尺寸 如果消费者尝试获取空队列元素,那原创 2017-08-11 11:17:06 · 349 阅读 · 0 评论 -
集合框架线程同步
首先研究下Collection下的同步和非同步,例如ArrayList List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)size、isEmpty、get、set、iterator 和 listIt转载 2017-01-14 16:45:46 · 488 阅读 · 0 评论 -
AtomicInteger理解和使用
AtomicInteger类的理解与使用首先看两段代码,一段是Integer的,一段是AtomicInteger的,为以下:public class Sample1 { private static Integer count = 0; synchronized public static void increment() { count++; }}以下是Atom转载 2017-07-31 09:01:57 · 682 阅读 · 0 评论 -
java编程思想笔记---并发Callable接口
public class TasksWithResult implements Callable<String> { private int id; public TasksWithResult(int id){ this.id=id; } //返回结果数据 @Override public String call() throws Exce原创 2017-07-31 16:51:18 · 348 阅读 · 0 评论 -
java编程思想笔记---并发优先级
2017/7/31创建/* * jdk的十个优先级与操作系统之间映射的不好,所以只推荐MAX_PRIORITY,NORM_PRIORITY,MIN_PRIORITY * 三个优先级 */public class SimplePriorities implements Runnable { private int countDown=5; //禁止编译器对变量d进行优化原创 2017-07-31 17:18:31 · 449 阅读 · 0 评论 -
java编程思想笔记-并发之后台线程
/** * * @author Allen * @date 2017-8-7 * */class DaemonThreadFactory implements ThreadFactory { @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r);原创 2017-08-07 17:06:12 · 334 阅读 · 0 评论 -
java编程思想-并发之线程异常处理器
/** * * @author wenruo * @date 2017-8-7 * */class ExceptionThread implements Runnable{ @Override public void run() { Thread t=Thread.currentThread(); System.out.println("原创 2017-08-07 21:55:09 · 293 阅读 · 0 评论 -
java编程思想笔记-并发之线程加入
package com.tij.learning1;/** * * @author wenruo * @date 2017-8-7 * */class Joiner extends Thread{ private Sleeper sleeper; public Joiner(String name,Sleeper sleeper){ super(nam原创 2017-08-07 18:57:05 · 353 阅读 · 0 评论 -
线程安全的单例模式
public class SafeLazyInitialization { private static Resource resource; public synchronized static Resource getInstance() { if (resource == null) resource = new Resource()原创 2017-08-08 09:41:17 · 252 阅读 · 0 评论 -
java编程思想笔记-并发之并发锁synchronized详解(二)
原文:http://blog.csdn.net/luoweifu/article/details/46613015 作者:luoweifu 转载请标名出处《编程思想之多线程与多进程(1)——以操作系统的角度述说线程与进程》一文详细讲述了线程、进程的关系及在操作系统中的表现,这是多线程学习必须了解的基础。本文将接着讲一下Java线程同步中的一个重要的概念synchronized.synchroni转载 2017-08-09 12:44:11 · 664 阅读 · 0 评论 -
java编程思想笔记-并发之并发锁(一)
package com.tij.thread.source;public abstract class IntGenerator { private volatile boolean canceled = false; public abstract int next(); public void cancel() { this.canceled = true;原创 2017-08-07 22:51:53 · 814 阅读 · 0 评论 -
ExecutorService对象的shutdown()和shutdownNow()的区别
可以关闭 ExecutorService,这将导致其拒绝新任务。提供两个方法来关闭 ExecutorService。shutdown() 方法在终止前允许执行以前提交的任务,而 shutdownNow() 方法阻止等待任务启动并试图停止当前正在执行的任务。在终止时,执行程序没有任务在执行,也没有任务在等待执行,并且无法提交新任务。应该关闭未使用的 ExecutorService 以允许回收其资源。转载 2017-08-09 16:16:06 · 406 阅读 · 0 评论 -
java编程思想笔记-并发之Synchronized嵌套调用
package com.tij.thread.cancel;//一个任务在持有一个对象锁时能够调用同一个对象的其它的synchronized方法public class MultiLock { public synchronized void f1(int count){ if(count-->0){ System.out.println("f1(原创 2017-08-10 08:56:44 · 2321 阅读 · 0 评论 -
线程同步之wait和notify
wait,notify方法是属于基类Object方法,调用wait方法时会将当前的线程挂起直到notify方法被调用,这和sleep方法有点类似,但是wait会释放当前线程持有调用wait方法的锁,并且wait,notify方法的调用必须必须持有调用wait,notify方法所在的对象锁,否则会抛出java.lang.IllegalMonitorStateExceptionsamp...原创 2017-08-10 15:59:39 · 633 阅读 · 0 评论 -
java编程思想笔记-并发之线程协作(二)
notify()与notifyAll()使用条件1.使用notify()在众多等待同一个锁的任务只有一个被唤醒 2.使用notifyAll(),只会唤醒希望持有当前锁的所有线程package com.tij.thread.cooperate;import java.util.Timer;import java.util.TimerTask;import java.util.concurrent原创 2017-08-10 21:32:36 · 346 阅读 · 0 评论 -
java编程思想笔记-并发之线程协作(三)
Condition类简介 使用互斥并允许任务挂起的基本类是Condition,可以使用Condition上的await()来挂起一个任务,可以使用signal()通知一个任务,signalAll()唤醒所有在这个Condition上挂起的任务,与notifyAll()相比,signalAll()是更安全的方式,同时任务在调用await(),signal()或者signalAll()必须拥有这个锁使原创 2017-08-10 22:14:22 · 390 阅读 · 0 评论 -
自旋锁和互斥锁的区别 java中lock Syntronized区别
转载自:http://blog.csdn.NET/susidian/article/details/51068858自旋锁(Spin lock)自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是 否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名。其作用是为了解决某项资源的互斥使用。因为自旋锁不会引起调用者睡眠,所以自旋锁的转载 2017-08-10 22:15:42 · 678 阅读 · 0 评论 -
java并发之CopyOnWriteArrayList
原理java普通的集合在遍历的时候不允许修改(add,remove,set)这样的操作,否则会抛出java.util.ConcurrentModificationException。为了支持集合的并发操作,于是CopyOnArrayList和CopyOnArraySet这样的数据结构就应运而生了.CopyOnArrayList这样的数据结构实现的思想是读写分离,通俗的讲在添加元素的时候,先将当...原创 2017-11-02 10:00:59 · 747 阅读 · 0 评论