并发
文章平均质量分 81
txxs
这个作者很懒,什么都没留下…
展开
-
Java并发小结,先验条件、后验条件等概念
Java多线程编程,是并发编程的一种(另一种重要的并发编程是多进程编程)。我们写java程序一般是运行在同一个进程中的,所以可以简单的认为:并发编程 = 多线程编程,让写操作系统的人去关注多进程编程吧。多线程编程是一个重要的软件基础,不管你的代码是不是多线程,java程序运行在jvm中一定是多线程运行的:运行你的main方法的线程,以及一些后台守护线程,如垃圾收集等。虽然在我们平时的程序中很少直接原创 2015-11-02 22:21:34 · 5312 阅读 · 1 评论 -
Lock与synchronized的区别
显示锁(Lock类)和内部锁(synchronized关键字)一、显示锁的锁定和释放必须放在一个try---finally块中二、Lock支持更细粒度的锁控制//可重入的读写锁private final ReentrantReadWriteLock rw = new ReentrantReadWriteLock ()//读锁private final Lock r =原创 2016-05-05 11:25:46 · 991 阅读 · 1 评论 -
在Java中wait、notify和notifyAll是如何工作的
Java中的多线程是一个非常复杂的问题,在写多线程的代码访问一个或多个共享资源的时候需要非常注意。Java5中引进了一些像BlockingQueue和Executor一样的类,移除了一些复杂的东西以便使用起来更加的简单。编程人员使用这些类的时候会比那些直接使用线程同步的编程人员感觉更好。和自己实现同步相比,我也推荐你使用这些新的API,但是很多时候我们也会因为各种各样的原因被要求这么做。当一些问题翻译 2016-01-28 19:41:49 · 916 阅读 · 0 评论 -
Java并发编程:Callable、Future和FutureTask
在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,就提供了Callable和Future,通过它们可以在任务执行完毕之后得到任务执转载 2016-01-11 11:21:38 · 469 阅读 · 0 评论 -
java中的lock
lock就像同步块一样是一种线程同步机制,除此之外locks要比java的同步块更加复杂。locks(和其他的更加先进的同步机制)是使用同步块创建的,所以我们完全摆脱synchronize关键字是不可能的。从java5开始,java.util.concurrent.locks包含了几种lock的实现,所以你或许不必实现自己的locks,但是,你依然要知道怎么样使用它们,知道他们背后的实现原理也是非翻译 2016-01-27 23:34:50 · 774 阅读 · 0 评论 -
竞争条件和关键区
竞争条件是一个可能发生在关键区域的特殊条件。关键区是由多线程执行的一个代码区,多线程一系列的并发执行关键区导致不同结果。多线程执行执行关键区的结果的不同和线程执行的顺序有关,关键区就被认为包含竞争条件。竞争条件这个词来源于线程竞争关键区的暗喻,竞争的结果会影响执行关键区的结果这个听起来可能有点复杂,所以我会在竞争条件和关键区上有一个详细的介绍。关键区在一个程序中运行多个线程程序自身不会翻译 2016-01-27 22:06:54 · 1774 阅读 · 0 评论 -
线程同步,对象级别的锁和类级别的锁
同步指的是多线程情况,一个线程块在一定时间内只能在一个线程内执行。java支持多线程执行,这就可能会导致两个或者多个线程访问同一个区域或者代码。同步是一个让所有并发的线程同步执行的过程。同步避免由共享内存不一致导致的内存错误,当一个方法被声明为同步的时候,线程保存着那个方法对象的监控,如果另一个线程正在执行这个同步方法,那么你的线程将会堵塞直到那个线程释放这个监控。在java中同步由synch翻译 2015-12-26 17:39:08 · 1356 阅读 · 0 评论 -
java线程中yield()和join()的区别
多线程在面试中是非常受欢饮的题目,我个人认为我们很少有机会能够真正的用到复杂的多线程(我在7年前使用过一次),熟悉这些概念能够增加你的信心,先前,我已经讨论了一个相似的问题,wait()和sleep()的区别。现在我们讨论一下join()和yield()的区别。坦白的讲,我在实际中比没有用过这两种方法,如果你觉得有问题请在评论中提出来java 线程调度的背景java虚拟机要求在多线程中实现翻译 2015-12-08 11:26:18 · 6758 阅读 · 4 评论 -
阻塞队列
阻塞队列是当队列为空并且你想出队时的一种队列,或者你想进入队列,但是队列已经满了。一个线程试图在一个空队列里边出队的话就会阻塞,直到其他的线程进入队列。一个线程试图进入一个满队列的时候它也会阻塞直到队列中的其他线程出队列或者清空队列之后。下边这个图展现了两个图通过一个队列如何进行合作的。java5在 java.util.concurrent package包中有阻塞队列的实现,你可翻译 2016-01-09 14:01:14 · 459 阅读 · 0 评论 -
java线程池
当在应用中需要限制某一时刻的线程的数量的时候线程池就很有用了。开启一个新的线程的时候会有性能上的开销,而且每一个线程需要为它的栈等分配一些内存。与为当前执行的线程开启一个新的线程相反的是,这个工作可以交于线程池来处理。一旦池中有空闲的线程,任务就会被分配线程池中的一个并且执行它。在内部,任务被插入到Blocking Queue,线程池中的线程也是在这里出队的。当一个新的任务插入到队列中的时候,翻译 2016-01-09 11:14:13 · 419 阅读 · 0 评论 -
java的同步块
Java的同步块标志了一个方法或者代码块是同步的。Java的同步块可以用来避免竞争条件。Java的同步关键字Java中的同步块是使用synchronized关键字标注的。Java中的同步块是在对象上同步的。所有在这些同时只能有一个线程在上边执行。其他线程想进入这个同步块只能等到同步块中的线程退出才可以。synchronized 关键字有四种标示的类型1、实例方法2、静态方法翻译 2016-01-24 20:47:28 · 539 阅读 · 0 评论 -
java volatile关键字
java的volatile关键字用来标注变量是存在主存中的。更精确的说,每一次读volatile变量都会从计算机主存中读取,而不是从CPU缓存中读取,每一次写入volatile变量都会最后写到主存中去,而不仅仅是CPU缓存。实际上,自从java5开始,volatile关键字不仅仅保证了变量的读和写都是在主存中发生的,我会在下边的章节中解释java volatile保证可见性java v翻译 2016-01-24 00:56:10 · 522 阅读 · 0 评论 -
线程死锁
线程死锁是多线程中最头疼的问题,一旦进入线程死锁,很多时候只能通过外部进程重启才能解决问题线程到达死锁的四个条件:互斥条件:一个资源每次只能被一个线程使用资源独占条件:一个线程因请求资源而阻塞时不剥夺条件::一个线程已获得的资源在未使用完成之前,不能强势剥夺循环等待条件:若干个线程之间形成一种头尾详解循环等待资源的关系要解决这种死锁必须从这四个条件入手,一般从以下两种方案入原创 2016-05-05 12:26:04 · 720 阅读 · 0 评论