Java/多线程
文章平均质量分 81
小白的学习笔记
这个作者很懒,什么都没留下…
展开
-
java锁的种类及研究
背景锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利,但是锁的具体性质以及类型却很少被提及。自旋锁自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被当前线程改变时其他前程才能进入临界区。 自旋锁流程:获取自旋锁时,如果没有任何线程保持该锁,那么将立即得到锁转载 2016-03-20 22:53:29 · 371 阅读 · 0 评论 -
JavaCAS操作
CAS,即Compare and Swap,中文翻译为“比较并交换”。对于JUC包中,CAS理论是实现整个java并发包的基石。从整体来看,concurrent包的实现示意图如下:i++是一个非常经典的操作,它几乎充斥着我们每个人编写的代码中。我们知道i++是可以分解的,它分解为getI()、i + 1 、setI三个步骤,所以它并不是原子操作。如果i==1,执行两次i++转载 2016-05-16 19:52:33 · 545 阅读 · 1 评论 -
ConcurrentLinkedQueue的实现原理分析
1. 引言在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,本文让我们一起来研究下Doug Lea是如何使用非阻塞的方式来实现线程安全队列Concurren转载 2016-05-16 20:03:04 · 780 阅读 · 0 评论 -
Java 并发:Executors 和线程池(不错)
本文译自:Java Concurrency – Part 7 : Executors and thread pools让我们开始来从入门了解一下 Java 的并发编程。本文主要介绍如何开始创建线程以及管理线程池,在 Java 语言中,一个最简单的线程如下代码所示:Runnable runnable = new Runnable(){ public void run(){转载 2016-05-16 20:53:56 · 3756 阅读 · 0 评论 -
Java中ThreadLocal的使用(转载)
感觉ThreadLocal的作用跟变量共享正好是相反的,ThreadLocal让每个线程都含有对应变量的一个副本,下面的博客说不是副本,意思是说这个值不是通过拷贝而来,每个线程之间的变量副本之间是相互隔离的,不存在共享。还有一个类InheritableThreadLocal可以在子线程中取得父线程继承下来的值。 下面这个图片来自《深入理解Struts》,懒得打字了,直接上图。 下面是转载的博客首转载 2016-05-01 16:07:44 · 394 阅读 · 0 评论 -
Java AIO总结与示例
AIO是异步IO的缩写,虽然NIO在网络操作中,提供了非阻塞的方法,但是NIO的IO行为还是同步的。对于NIO来说,我们的业务线程是在IO操作准备好时,得到通知,接着就由这个线程自行进行IO操作,IO操作本身是同步的。但是对AIO来说,则更加进了一步,它不是在IO准备好时再通知线程,而是在IO操作已经完成后,再给线程发出通知。因此AIO是不会阻塞的,此时我们的业务逻辑将变成一个回调函数,等待I原创 2016-08-16 17:59:56 · 18689 阅读 · 5 评论 -
akka introduce
什么是Akka,Akka主要用来编写分布式的,可扩展的,并发的应用程序,详见官方文档,官方文档真的好长啊,这里记了一些akka的helloworld程序,算是简单入门吧。Akka总结Actor模型基于一种通过消息进行通信的简单的actor实体结构,能够轻松地构建应用程序来实现高并发性和可伸缩性。 用于并发计算的actor模型基于各种称为actor的原语来构建系统。A原创 2016-08-18 15:45:11 · 597 阅读 · 0 评论 -
并行编程框架 ForkJoin(介绍了一点原理,可扩展)
本文假设您已经了解一般并行编程知识,了解Java concurrent部分如ExecutorService等相关内容。虽说是Java的ForkJoin并行框架,但不要太在意Java,其中的思想在其它语言环境也是同样适用的。因为并发编程在本质上是一样的。就好像如何找到优秀的Ruby程序员?其实要找的只是一个优秀的程序员。当然,如果语言层面直接支持相关的语义会更好。 引言Java 语言转载 2016-09-09 10:49:16 · 2418 阅读 · 0 评论 -
Java 理论与实践: 应用 fork-join 框架(转自ibm)
转载自:Java 理论与实践: 应用 fork-join 框架硬件趋势驱动编程语言语言、库和框架形成了我们编写程序的方式。Alonzo Church 早在 1934 年就曾表明,所有已知的计算性框架对于它们所能表示的程序集都是等价的,程序员实际编写的程序集是由特定语言形成的,而编程模型(由语言、库和框架驱动)可以简化这些语言的表达。另一方面,一个时代的主流硬件平台形成了我们转载 2016-09-09 15:02:01 · 714 阅读 · 0 评论 -
《Java性能优化...》读书笔记
1、JVM虚拟机内存分配参数-Xmx:设置最大堆大小,最大堆指的是新生代和年老代的大小之和的最大值,它是Java应用程序的堆上限。当使用值超过这个限制时会抛出OutOfMemoryError异常。可以使用循环申请1M空间(new byte[1024*1024])进行测试,-Xms:设置最小堆(可以认为后面的s代表small)大小,Java应用程序在运行时,首先会被分配-Xms指定的内存原创 2016-08-20 15:13:56 · 759 阅读 · 1 评论 -
使用ReentrantLock实现线程同步
在Java多线程中,可以使用synchronized关键字来实现线程之间同步互斥,但在JDK1.5中新增了ReentrantLock类也能达到同样的效果,并且在扩展功能上也更加强大,比如有嗅探锁定、多路分支通知等功能,而且在使用上也比synchronized更加灵活。下面以一个例子来说明ReentrantLock的使用。首先是Service类,需要被同步的类。import java.util.con原创 2016-05-02 10:58:50 · 640 阅读 · 0 评论 -
Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析(还没看,先马)
转自:Java阻塞队列ArrayBlockingQueue和LinkedBlockingQueue实现原理分析Java中的阻塞队列接口BlockingQueue继承自Queue接口。BlockingQueue接口提供了3个添加元素方法。add:添加元素到队列里,添加成功返回true,由于容量满了添加失败会抛出IllegalStateException异常 offer:添加元素到队列里,添加成功返回转载 2016-09-12 14:16:31 · 5885 阅读 · 0 评论 -
扩展ThreadPoolExecutor打印线程错误堆栈
在使用JDK Executors产生线程池执行任务时,如果使用threadPool.submit(Runnable)来提交任务,且不调用future.get时,如果线程发生错误,程序是不会打印错误堆栈的,比如下面的程序,当i==0时,100/i发生运行时异常,只有四组输出(应该有五组),但是程序不会打印任何异常信息,import java.util.concurrent.Synchronous原创 2016-08-10 21:34:05 · 2180 阅读 · 0 评论 -
倒计时器:CountDownLatch
CountDownLatch是一个非常实用的多线程控制工具类。其使用场景是一些线程等待另一些线程结束之后才执行。一个简单的例子是火箭发射程序。在火箭发射之前要进行检查任务,检查任务完成之后才进行火箭发射。使用CountDownLatch可以很容易完成程序。CountDownLatch的构造函数有一个int整数,用来标示执行任务之前需要执行的countDownLatch.countDown次数。 程原创 2016-08-12 21:13:55 · 492 阅读 · 0 评论 -
一个并行搜索算法
抄自《实战Java高并发程序设计》package understanding;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.con原创 2016-08-13 16:14:54 · 4147 阅读 · 0 评论 -
Java NIO 总结与示例
Java NIO是New IO的简称,它是一种可以替代Java IO的一套新的IO机制。它提供了一套不同于Java标准IO的操作机制。Java NIO中涉及的基础内容有通道(Channel)和缓冲区(Buffer)、文件IO和网络IO。有关通道、缓冲区以及文件IO在这里不打算进行详细的介绍。这里参考《实战Java高并发程序设计》利用NIO实现一个Echo服务器的服务端与客户端。在看原创 2016-08-14 21:03:12 · 812 阅读 · 0 评论 -
《实战Java...》读书笔记
1、如何终止一个线程? 调用stop()方法不可取,因为stop会立即停止线程并释放锁,容易导致不一致,那怎么停止呢?一般是给线程设置一个标志位表示是否继续运行,然后设置一个方法,用来将标志位设置为false,并且在run方法中不断坚持这个标志位,如果为false则使用break跳出无限循环。 2、调用Thread.sleep时要处理InterruptedException,也就原创 2016-08-14 22:16:16 · 578 阅读 · 0 评论 -
Java-Fork/Join的简单例子(入门)
fork/join的使用1、创建一个ForkJoinPool,forkjoin池。ForkJoinPool forkJoinPool = new ForkJoinPool();2、创建一个task任务,任务继承自RecursiveTask,Integer表示返回结果的类型CountTask task = new Cou转载 2016-05-04 23:12:43 · 1815 阅读 · 0 评论 -
Fork and Join: Java编写并发程序(重要)
本文转载自 并发编程网Fork and Join: Java也可以轻松地编写并发程序,感觉类似于一个map reduce框架如今,多核处理器在服务器,台式机及笔记本电脑上已经很普遍了,同时也被应用在更小的设备上,比如智能手机和平板电脑。这就开启了并发编程新的潜力,因为多个线程可以在多个内核上并发执行。在应用中要实现最大性能的一个重要技术手段是将密集的任务分隔成多个可以并行执转载 2016-05-04 22:54:14 · 1610 阅读 · 0 评论 -
Java 线程池的原理与实现
简单介绍 创建线程有两种方式:继承Thread或实现Runnable。Thread实现了Runnable接口,提供了一个空的run()方法,所以不论是继承Thread还是实现Runnable,都要有自己的run()方法。 一个线程创建后就存在,调用start()方法就开始运行(执行run()方法),调用wait进入等待或调用sleep进入休眠期,顺利运行完毕或休眠被中断或运转载 2016-03-29 11:28:46 · 447 阅读 · 0 评论 -
线程间协作:wait、notify、notifyAll
在 Java 中,可以通过配合调用 Object 对象的 wait() 方法和 notify()方法或 notifyAll() 方法来实现线程间的通信。在线程中调用 wait() 方法,将阻塞等待其他线程的通知(其他线程调用 notify() 方法或 notifyAll() 方法),在线程中调用 notify() 方法或 notifyAll() 方法,将通知其他线程从 wait() 方法处返回。Ob转载 2016-03-15 23:03:31 · 483 阅读 · 0 评论 -
synchronized 关键字
在并发编程中,多线程同时并发访问的资源叫做临界资源,当多个线程同时访问对象并要求操作相同资源时,分割了原子操作就有可能出现数据的不一致或数据不完整的情况,为避免这种情况的发生,我们会采取同步机制,以确保在某一时刻,方法内只允许有一个线程。采用 synchronized 修饰符实现的同步机制叫做互斥锁机制,它所获得的锁叫做互斥锁。每个对象都有一个 monitor (锁标记),当线程拥有这个锁标记时才能转载 2016-03-15 21:15:27 · 305 阅读 · 0 评论 -
Java 等待多个子线程 join
thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。t.join(); //使调用线程 t 在此之前执行完毕。t.join(1000); //等待 t 线程,等待时间是1000毫秒要想主线程main等待若干线程结束之后再执行,需原创 2016-02-19 17:30:11 · 2221 阅读 · 2 评论 -
Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐。虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用。之前,我讨论了一个wait()和sleep()方法区别的问题,这一次,我将会讨论join()和yield()方法的区别。坦白的说,实际上我并没有用过其中任何一个方法,所以,如果你感觉有不恰当的地方,请提出讨论。Jav转载 2016-03-30 09:32:27 · 416 阅读 · 0 评论 -
线程池实例:使用Executors和ThreadPoolExecutor
线程池负责管理工作线程,包含一个等待执行的任务队列。线程池的任务队列是一个Runnable集合,工作线程负责从任务队列中取出并执行Runnable对象。java.util.concurrent.executors 提供了 java.util.concurrent.executor 接口的一个Java实现,可以创建线程池。下面是一个简单示例:首先创建一个Runable 类:WorkerT转载 2016-03-30 09:53:02 · 1326 阅读 · 0 评论 -
Java如何停止线程
思路为: 在调用thread.start()方法之后,调用thread.interrupt()方法来中断这个方法。在thread的run()方法中,运行之前要检查本线程是否被中断(用this.interrupted()或this.isInterrupted(),前者为静态方法,感觉没什么区别),如果被中断,则要throw一个InterruptedException,从而导致run()方法停止运行,原创 2016-04-28 10:01:30 · 1409 阅读 · 1 评论 -
Java死锁示例及检测
死锁是指多个线程在等待不可能被释放的锁,导致程序无法继续运行,下面用一个例子来说明。线程A持有lock1,在等待lock2,线程B持有lock2,在等待lock1,这样就发生了死锁。首先看一个类DealThread,这个类含有互斥锁,以synchronized代码块的形式表示,线程A使用锁的顺序是lock1->lock2。线程B使用锁的顺序是lock2->lock1。在一个线程获得一个锁后,在获得第原创 2016-04-30 11:55:39 · 886 阅读 · 0 评论 -
Java内存模型
Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型。如果你想设计表现良好的并发程序,理解Java内存模型是非常重要的。Java内存模型规定了如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。原始的Java内存模型存在一些不足,因此Ja转载 2016-04-30 20:50:49 · 429 阅读 · 0 评论 -
java volatile关键字(及使用场景)
当一个变量被定义为volatile之后,就可以保证此变量对所有线程的可见性,即当一个线程修改了此变量的值的时候,变量新的值对于其他线程来说是可以立即得知的。可以理解成:对volatile变量所有的写操作都能立刻被其他线程得知。但是这并不代表基于volatile变量的运算在并发下是安全的,因为volatile只能保证内存可见性,却没有保证对变量操作的原子性。比如下面的代码: /**转载 2016-02-24 10:55:24 · 6003 阅读 · 0 评论 -
Java用wait() notify()实现线程间通信
博客 线程间协作:wait、notify、notifyAll讲了这几个方法的使用,这篇博客举例说明。要解决的问题是: 实现两个线程A,B,A打印5个奇数,B打印5个偶数,交替进行,如此循环50次。要点: 1. 在同一个类中实现打印奇数和打印偶数的方法,并且这两个方法都需要被synchronized修饰,因为wait() notify()只能在synchronized修饰的代码块中运行。 2.原创 2016-03-20 11:46:10 · 522 阅读 · 0 评论 -
Java通过管道进行进程间通信
Java语言中提供了各种各样的输入输出流Stream,使我们能够很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间之间传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通信,而无须借助类似于临时文件之类的东西。在Java的JDK中提供了4个类来使线程间可以相互通信: 1)PipedInputSteam和Pipe原创 2016-05-01 12:28:25 · 4335 阅读 · 2 评论 -
ReentrantLock使用Condition实现通知部分线程
关键字synchronized与wait()和notify()/notifyAll()方法想结合可以实现等待/通知模式,类ReentrantLock也可以实现同样的功能,但需要借助于Condition对象。Condition类在JDK5中出现,使用它有更好的灵活性,比如可以实现多路通知的功能,也就是在一个Lock对象中可以创建多个Condition对象(对象监视器),线程对象可以注册在指定的Cond原创 2016-05-02 11:50:50 · 1536 阅读 · 0 评论 -
使用ReentrantReadWriteLock类
类ReentrantLock具有完全互斥排他的效果,即同一时刻只有一个线程在执行ReentrantLock.lock()方法后面的任务。这样虽然保证了实例变量的线程安全性,但是效率确实非常低下的。所以在JDK中提供了一种读写锁ReentrantReadWriteLock类,使用它可以加快运行效率,在某些不需要操作实例变量的方法中,完全可以使用读写锁ReentrantReadWriteLock来提升该原创 2016-05-02 15:14:55 · 414 阅读 · 0 评论 -
Java阻塞队列的实现 (简洁明了)
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列,下图展示了如何通过阻塞队列来合作:转载 2016-05-13 21:51:23 · 4437 阅读 · 0 评论 -
《实战Java...》读书笔记2
10、锁消除也是一种优化技术,一个例子是在不需要同步的地方使用了线程安全的数据结构,比如在线程的局部变量中使用了Vector,一个线程的局部变量是不能被其他线程访问的,不存在多线程问题,虚拟机检测到这样的问题就会将不必要的锁去除。 11、关于ThreadLocal,ThreadLocal是为了让每个线程都拥有一个对象的副本,多个线程之间不存在相互干扰。具体实现上,每个线程都持有一个Thre原创 2016-08-14 22:17:32 · 543 阅读 · 0 评论