
多线程
文章平均质量分 73
EthanPark
中科大硕士. 擅长领域高并发企业级应用性能优化。喜爱钻研源码。业余参与国外Spring以及Servlet,JDBC等Spec的翻译。
展开
-
Java线程和多线程(四)——主线程中的异常
作为Java的开发者,在运行程序的事后会碰到主线程抛异常的情况。如果开发者使用Java的IDE比如Eclipse或者Intellij IDEA的话,可能是不需要直接面对这个问提的,因为IDE会处理运行类来处理这些问题。下面将描述一些在命令行模式下运行Java程序可能会碰到的异常。java.lang.UnsupportedClassVersionError这个异常时因为你的Java类是由另一个其他版本原创 2016-08-16 11:01:20 · 3981 阅读 · 1 评论 -
公平锁与非公平锁
在ReentrantLock中很明显可以看到其中同步包括两种,分别是公平的FairSync和非公平的NonfairSync。公平锁的作用就是严格按照线程启动的顺序来执行的,不允许其他线程插队执行的;而非公平锁是允许插队的。默认情况下ReentrantLock是通过非公平锁来进行同步的,包括synchronized关键字都是如此,因为这样性能会更好。因为从线程进入了RUNNABLE状态,可以执行开始,原创 2017-02-17 13:32:14 · 15930 阅读 · 0 评论 -
Java线程和多线程(十四)——Synchronized关键字解析
曾经有一个比较有趣的面试问题,那就是,关于使用synchronized关键字,是用在方法上面尾号,还是用在一个代码块上面为好?答案就是使用锁定代码块为更好。因为这样不会锁定对象。当synchronized关键字在实例方法的上面时,线程对于该方法的访问会直接锁定整个对象,参考如下代码:class Sync { public synchronized void syncMethod() {原创 2016-11-27 23:29:23 · 2021 阅读 · 0 评论 -
Java线程和多线程(十三)——Callable,Future,FutureTask
在Java多线程之中,Callable和Future的使用时非常广泛的。在之前的文章中,我们了解了关于Java线程池基础的一些内容,知道如何提交Runnable的任务。但是,Runnable的任务是无法有返回值,也不能抛出异常的。而有些时候,我们希望一个线程能够有一些返回值。在Java 5中,引入了java.util.concurrent.Callable接口,这个接口很类似于Runnable接口,原创 2016-11-02 10:49:46 · 6289 阅读 · 4 评论 -
Java线程和多线程(十二)——线程池基础
Java 线程池管理多个工作线程,其中包含了一个队列,包含着所有等待被执行的任务。开发者可以通过使用ThreadPoolExecutor来在Java中创建线程池。 线程池是Java中多线程的一个重要概念,因为通过Thread模型来控制多线程是非常麻烦以及易错的一个过程。过多的释放线程会造成线程调度的变慢以及过度的消耗内存。而频繁的创建线程,也没有很好的复用线程,所以有了线程池的概念。Java中的原创 2016-10-30 11:12:43 · 10357 阅读 · 0 评论 -
Java线程和多线程(十)——TimerTask
Java中的java.util.Timer是一个工具类,可以用于调度一个线程在将来的某一个时刻执行特定的任务。Java Timer类可以将一个任务定时执行一次,或者是以后以每隔一定的时间间隔来触发一次。Java TimerTaskjava.util.TimerTask是一个抽象类,也同时实现了Runnable接口的。我们可以继承这个类来创建我们自己的TimerTask之后由Timer来调度。Java原创 2016-10-15 19:12:46 · 7837 阅读 · 1 评论 -
Java线程和多线程(九)——死锁
Java中的死锁指的就是一种多于两个线程永远阻塞的特殊状况。Java中的死锁状态至少需要多于两个线程以及资源的时候才会产生。这里,我写了一个产生死锁的程序,并且讲下如何分析死锁。首先来看一下产生死锁的程序:package com.sapphire.threads;public class ThreadDeadlock { public static void main(String[] arg原创 2016-10-13 20:45:49 · 3506 阅读 · 2 评论 -
Java线程和多线程(八)——Thread Dump
Java的Thread Dump就是列出JVM中所有激活状态的线程。Java Thread DumpJava Thread Dump在分析应用性能瓶颈和死锁的时候,是非常有效的。下面将介绍多种不同的方式来获取Java程序的Thread Dump信息。这些指令在*nix型的操作系统下是有效的,但是在Windows下面,采取的方式会有一些不同。(主要是Pid信息获取不太一致,可通过任务管理器获取)Vi原创 2016-09-27 22:54:51 · 10911 阅读 · 1 评论 -
Java线程和多线程(十一)——BlockingQueue
这次讨论的是Java的BlockingQueue,java.util.concurrent.BlockingQueue是一个Java的队列接口,支持一系列操作,比如,在获取和移除对象的时候如果队列为空会来等待队列变成非空的,而当队列满了的时候,插入元素会等待队列中的元素被移除,保证队列有空余的空间。Java的BlockingQueue是不能接受null的值,如果传入null将会跑出NullPoint原创 2016-10-22 18:51:38 · 3587 阅读 · 0 评论 -
Java线程和多线程(七)——ThreadLocal
Java中的ThreadLocal是用来创建线程本地变量用的。我们都知道,访问某个对象的所有线程都是能够共享对象的状态的,所以这个对象状态就不是线程安全的。开发者可以通过使用同步来保证线程安全,但是如果不希望使用同步的话,我们也可以使用ThreadLocal变量。Java ThreadLocal其实每个线程都有自己的ThreadLocal变量,并且这个变量可以通过get()和set()方法来获取默认原创 2016-09-24 18:16:04 · 2521 阅读 · 1 评论 -
Java线程和多线程(六)——守护线程
当我们在Java中创建线程的时候,这个线程在默认的情况下是一个用户线程,并且,如果这个线程在运行,那么JVM就不会终结这个应用。和用户线程不同,当一个线程被标记为守护线程的时候,JVM在用户线程结束的时候,是不会持续等待守护线程结束的,而是直接结束程序,并且结束程序中相关的守护线程。Thread.setDaemon(true)方法可以用来将线程置为守护线程,参考下面的例子:package com.s原创 2016-09-20 13:11:00 · 3187 阅读 · 1 评论 -
Java线程和多线程(五)——单例类中的线程安全
单例模式是最广泛使用的创建模式之一。在现实世界之中,诸如Databae的连接或者是企业信息系统(EIS)等,通常其创建都是受到限制的,应该尽量复用已存在对象而不是频繁创建销毁。为了达到这个目的,开发者通常会通过实现单例模式来创建一个wrapper类,来封装资源,限制其运行时所创建对象的个数。单例中的线程安全总的来说,开发者一般会按照如下的方式来创建单例的类:使用私有构造函数来避免其它外部引用通过n原创 2016-09-17 15:05:59 · 2010 阅读 · 1 评论 -
Java线程和多线程(一)——线程的基本概念
Java 线程是一个轻量级执行任务的处理单元。Java提供了Thread类来支持多线程,开发者在应用中可以创建多个线程来支持并发执行任务。在应用中存在两种类型的线程,用户线程和守护线程。当我们启动应用的时候,main函数是第一个启动的用户线程,开发者可以在之后自由的创建用户线程。当所有的线程执行完毕,JVM会终结掉程序。开发者也可以配置不同线程的优先级,但是这并不代表更高优先级的线程会比低优先级的线原创 2016-06-21 10:27:55 · 3126 阅读 · 1 评论 -
Java线程和多线程(二)——对象中的wait,notify以及notifyAll方法
在Java的Object类中包含了3个final的方法,这三个方法允许线程来交流资源是否被锁定。这三个方法就是wait(),notify()以及notifyAll().在对象上调用这三个方法的线程需要包含一个对象监视器(锁),否则就会抛出java.lang.IllegalMonitorStateException异常。wait方法对象的wait方法由三个,一个是令对象等待任何线程来调用notify或原创 2016-07-15 13:07:21 · 1891 阅读 · 1 评论 -
Java线程和多线程(三)——线程安全和同步
线程安全在Java中是一个很重要的课题。Java提供的多线程环境支持使用Java线程。我们都知道多线程共享一些对象实例的话,可能会在读取和更新共享数据的事后产生数据不一致问题。线程安全之所以会产生数据的不一致问题,是因为更新实例变量等类似的行为并非是源自操作。这类操作会有三个步骤:读取当前的值做一些必要的操作来获取更新的值讲更新的值写会变量之中原创 2016-08-01 18:04:05 · 2192 阅读 · 1 评论 -
Java线程和多线程(十五)——线程的活性
当开发者在应用中使用了并发来提升性能的同时,开发者也需要注意线程之间有可能会相互阻塞。当整个应用执行的速度比预期要慢的时候,也就是应用没有按照预期的执行时间执行完毕。在本章中,我们来需要仔细分析可能会影响应用多线程的活性问题。死锁死锁的概念在软件开发者中已经广为熟知了,甚至普通的计算机用户也会经常使用这个概念,尽管不是在正确的状况下使用。严格来说,死锁意味着两个或者更多线程在等待另一个线程释放其锁定原创 2017-02-17 13:22:49 · 4558 阅读 · 1 评论