![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
Ydoing
这个作者很懒,什么都没留下…
展开
-
Java多线程并发编程之显示锁ReentrantLock和读写锁
在Java5.0之前,只有synchronized(内置锁)和volatile. Java5.0后引入了显示锁ReentrantLock.ReentrantLock概况ReentrantLock是可重入的锁,它不同于内置锁, 它在每次使用都需要显示的加锁和解锁, 而且提供了更高级的特性:公平锁, 定时锁, 有条件锁, 可轮询锁, 可中断锁. 可以有效避免死锁的活跃性问题.Ree原创 2015-03-01 14:10:25 · 1628 阅读 · 0 评论 -
Java并发编程类学习四(线程安全的类)
同步容器类Vector和Hashtable是重量级线程安全的,不建议使用。另外还可以用Collections.synchronizedXXXX工厂方法同步类。并发容器ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque、ConcurrentSkipListSet和CopyOnWriteArrayList等等。他们都是线程安全的。阻原创 2015-12-25 17:21:35 · 478 阅读 · 0 评论 -
Java并发编程类学习五(同步工具)
内置锁(synchronized)每个Java对象都对应有一个内置锁。有两种方式:第一种直接修饰方法;第二种synchronized后跟加锁的对象。 示范: public synchronized void doSomething(Object obj){ synchronized(obj){ //execute action }原创 2015-12-25 17:22:34 · 556 阅读 · 0 评论 -
Java并发编程类学习总结
线程的定义Runnable定义线程的接口,只有一个run()方法,而且没有返回值。一般通过实现这个接口来定义线程。public interface Runnable { public abstract void run();} 经常可以用匿名内部类实现: new Thread(new Runnable(){ @Override原创 2015-12-25 17:23:34 · 713 阅读 · 0 评论 -
Java并发编程学习路线图
思维导图如下:原创 2016-05-18 10:08:31 · 2571 阅读 · 1 评论 -
Java线程安全策略
不可变final事实不可变如String无状态没有实例域如Servletvolatile运算结果不依赖当前变量值不参与不变性约束如AQS的state线程封闭线程栈内私有,方法中局部变量的使用ThreadLocal,相当月MapJ.U.C工具包以Concurrent前缀的并发类,如ConcurrentHashMap含有Blocking的阻塞类,如LinkedBlockin原创 2016-04-23 16:51:32 · 975 阅读 · 0 评论 -
Guava中并发ListenableFuture使用
最近在项目中要优化接口,发现guava并发编程中的ListenableFuture比较适合,所以就用上了。感觉还不错,分享一下。使用场景是这样的,客户端需要上传数据到服务端,涉及到几个表的插入。之前都是一个一个表插入的,性能不是很好的。现在改为并发插入,代码如下:private ListeningExecutorService executorService = MoreExecutors.list原创 2016-05-19 14:28:10 · 6193 阅读 · 2 评论 -
Java线程安全详细总结
以下是我的PPT文档,不知道怎么复制到博客,只能一个一个插入图片发上来了。感觉总结的不错,分享一下。原创 2016-05-20 22:13:02 · 612 阅读 · 0 评论 -
从ReentrantLock去分析AbstractQueuedSynchronizer
在并发中,锁是一个重要的工具,能帮助程序处理好数据并发处理不一致的问题,而AbstractQueuedSynchronizer在其中扮演中重要的角色。在设计所锁的时候,应该思考怎么锁能解决什么问题,而这个问题本质是由于什么原因引起。并发问题说到底是由于资源共享竞争使用引起的。锁就是为了防止资源不合理竞争使用导致的并发问题。AQS简介AbstractQueuedSynchronizer简称AQS,是J原创 2017-03-04 18:06:06 · 577 阅读 · 0 评论 -
Java中sleep和wait有什么区别?
sleep和wait有什么区别?大家都说是sleep不会释放锁,wait会释放锁。一直都不是很理解。最近在看AQS代码,才找到一些蛛丝马迹。AQS的await和wait实现思想类似,释放当前占有的锁,让其他线程继续获取锁。等适合机会唤醒后再重新占有锁。await方法有fullyRelease的方法 1.先将线程插入等待队列; 2.释放当前的占有的资源,即释放锁; 3.让当前线程停止,等待唤醒;原创 2017-03-05 16:08:41 · 1138 阅读 · 0 评论 -
Java并发编程类学习三(线程的执行)
Executor任务运行的执行器。可以解耦任务提交和计算的过程。换句话说,只管提交给执行器执行,而不用关系执行的内部过程。 任务被提交后是立即执行的。public interface Executor { void execute(Runnable command);} ExecutorServiceExecutorService继承了Executor接口。提供了管理任务终止的功能,并且原创 2015-12-25 17:20:14 · 487 阅读 · 0 评论 -
Java并发编程类学习二(线程的包装)
线程的包装可以用这些类对线程进行包装,获取线程的运行的状态。Future表示异步计算处理后的结果。可以检查计算是否完成,是否可以取消。get()方法将一直阻塞等到计算的完成才返回结果。public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled();原创 2015-12-25 17:18:57 · 486 阅读 · 0 评论 -
Java并发编程之栅栏(CyclicBarrier)详解
栅栏类似闭锁,但是它们是有区别的. 闭锁用来等待事件,而栅栏用于等待其他线程.什么意思呢?就是说闭锁用来等待的事件就是countDown事件,只有该countDown事件执行后所有之前在等待的线程才有可能继续执行;而栅栏没有类似countDown事件控制线程的执行,只有线程的await方法能控制等待的线程执行.CyclicBarrier强调的是n个线程,大家相互等待,只要有一个没完成,所有人都得原创 2015-03-17 10:25:41 · 8380 阅读 · 1 评论 -
Java并发编程实践(读书笔记) 任务执行(未完)
任务的定义大多数并发程序都是围绕任务进行管理的.任务就是抽象和离散的工作单元. 任务的执行策略 1.顺序的执行任务这种策略的特点是一般只有按顺序处理到来的任务.一次只能处理一个任务,后来其它任务都要等待处理.响应性很糟糕,吞吐量低.系统资源利用率低.2.显示的为任务创建线程为每个任务创建对应一个线程,响应快,系统资源利用路高.缺点是资源消耗原创 2015-03-01 14:09:17 · 498 阅读 · 0 评论 -
Java多线程并发编程之变量
编写线程安全需要关心的:共享的变量可变的变量共享意味着多个线程可以同时访问,可变意味着其值在生命周期可以改变。例如以下count 变量://线程不安全的类public class UnsafeCount { private int count = 0; //该变量是共享的 public void increase() {原创 2015-03-12 09:49:48 · 1317 阅读 · 0 评论 -
多线程并发编程之原子变量与非阻塞同步机制
1.非阻塞算法非阻塞算法属于并发算法,它们可以安全地派生它们的线程,不通过锁定派生,而是通过低级的原子性的硬件原生形式 —— 例如比较和交换。非阻塞算法的设计与实现极为困难,但是它们能够提供更好的吞吐率,对生存问题(例如死锁和优先级反转)也能提供更好的防御。使用底层的原子化机器指令取代锁,比如比较并交换(CAS,compare-and-swap).2.悲观技术独占锁是一种悲观的技术.它假设最坏的情况原创 2015-03-01 13:52:17 · 734 阅读 · 0 评论 -
Java并发编程之ThreadLocal类详解
ThreadLocal类可以理解为ThreadLocalVariable(线程局部变量),提供了get与set等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回当前执行线程在调用set时设置的最新值。可以将ThreadLocal视为 包含了Map对象,保存了特定于该线程的值。概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式原创 2015-03-12 21:39:49 · 663 阅读 · 0 评论 -
Java并发编程之volatile变量
volatile提供了弱同步机制,用来确保将变量更新通知到其它线程。volatile变量不会被缓存在寄存器中或者对其它处理器不可见的地方,因此在读取volatile变量时总会返回最新写入的值。可以想象成如下语义,然而volatile是更轻量级的同步机制。volatile只能确保可见性,但不能保证原子性。也就是说不能在复合操作用volatile变量,比如i++。public sync原创 2015-03-14 16:53:12 · 672 阅读 · 0 评论 -
Python进程分支fork和exec详解
在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支. - fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独立父进程外运行. - fork()是一个很特殊的方法,一次调用,两次返回. - fork()它会返回2个值,一个值为0,表示在子进程返回;另外一个值为非0,表示在父进程中返回子进程ID.以下只能在原创 2015-04-07 10:52:52 · 3673 阅读 · 0 评论 -
Java多线程并发编程之构建自定义同步工具
当Java类库没有提供适合的同步工具时,就需要构建自定义同步工具。可阻塞状态依赖操作的结构acquir lock on object state;//请求获取锁while(precondition does not hold){//没有满足前提条件 release lock;//先释放锁 wait until precondition might原创 2015-03-01 14:12:21 · 589 阅读 · 0 评论 -
Java并发编程之闭锁CountDownLatch简介
闭锁相当于一扇门,在闭锁到达结束状态之前,这扇门一直是关闭着的,没有任何线程可以通过,当到达结束状态时,这扇门才会打开并容许所有线程通过。它可以使一个或多个线程等待一组事件发生。闭锁状态包括一个计数器,初始化为一个正式,正数表示需要等待的事件数量。countDown方法递减计数器,表示一个事件已经发生,而await方法等待计数器到达0,表示等待的事件已经发生。CountDownLatch强调的是一原创 2015-03-13 07:54:33 · 1274 阅读 · 0 评论 -
Java并发编程类学习一(线程的定义)
Runnable定义线程的接口,只有一个run()方法,而且没有返回值。一般通过实现这个接口来定义线程。public interface Runnable { public abstract void run();} 经常可以用匿名内部类实现: new Thread(new Runnable(){ @Override publi原创 2015-12-25 17:17:26 · 550 阅读 · 0 评论 -
ThreadPoolExecutor源码剖析的一些思考和总结
最近迁移一个项目,涉及到线程池的问题。特意看了一下ThreadPoolExecutor源码,记录一下。思考几个问题ThreadPoolExecutor的基本实现思路是什么? - 在线程池正在运行(running)的状态下,提交任务到线程池以后,如果线程数量小于corePoolSiez,则创建新的工作线程加入workers中,并启动该线程;如果大于等于corePoolSiez,则加入任务队列中,等待原创 2017-06-05 17:54:33 · 949 阅读 · 0 评论