04 2017 档案
摘要:查询结果: 执行: 得到: 执行: 得到: 执行: 得到:
阅读全文
摘要:容器是所有编程中的基础工具,这其中也包括并发编程。出于这个原因,像Vector和Hashtable这类早期容器具有许多synchronized方法,当他们用于非多线程的应用程序中时,便会导致不可接受的开销。在Java1.2中,新的容器类库是不同步的,并且Collections类提供了各种static
阅读全文
摘要:Exchanger是两个任务之间交换对象的栅栏,当这些任务进入栅栏时,它们各自拥有一个对象,当它们离开时,它们都拥有之前由对象持有的对象。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点
阅读全文
摘要:正常的锁在任何时刻都只允许一个任务访问一项资源,而计数信号量允许n个任务同时访问这个资源。 一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不
阅读全文
摘要:翻译: 它适用于这样一种情况:你希望创建一组任务,它们并行地执行工作,然后在进行下一个步骤之前,进行等待,直到所有任务完成,有点像join。它使得所有的并行任务都将在栅栏处列队,因此可以一致地向前移动。这非常像CountDownLatch.只是后者只触发一次时间,而前者可以多次重用。每个线程调用aw
阅读全文
摘要:它被用来同步一个或者多个任务,轻质它们等待由其他任务执行的一组操作完成。 你可以向 CountDownLatch 对象设置一个初始计数值,任何在这个对象上调用 await() 的方法都将阻塞,直到这个计数值为0。其他任务在结束其工作时,可以在该对象上调用 countDown() 来减小这个数值,这个
阅读全文
摘要:支持两个附加操作的 Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用。 BlockingQueue 方法以四种形式出现,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:第一种是抛出一个异常,第二种是返回一个特殊值(null 或 fal
阅读全文
摘要:线程中断我们已经直到可以使用 interrupt() 方法,但是你必须要持有 Thread 对象,但是新的并发库中似乎在避免直接对 Thread 对象的直接操作,尽量使用 Executor 来执行所有的请求。如果你在 ExecutorService 上调用 shutdownNow() .那么它将发送
阅读全文
摘要:一. 线程状态类型1. 新建状态(New):当线程对象被创建时。它只会短暂的处于这种状态。此时它已经分配了必须的系统资源。并且执行了初始化。此刻线程已经有资格获得CPU时间了。之后调度器将把这个线程转变为可运行或者阻塞状态。2. 就绪状态(Runnable):该线程的start()方法被其他线程调用
阅读全文
摘要:下面用javap分析一下为什么i++不安全 执行 javap -c TestIncrement 得到的结果为: 方法f1()中, 1:(getField)进行了获取filed i的操作, code 2 2:然后取常量值1, code 5 3:再把取到的值1加到代号2取到的值上, code 6 4:再
阅读全文
摘要:在有关java线程的讨论中,一个常不正确的知识是:“原子操作不需要同步控制”。原子操作是不能被线程调度戒指中断的操作;一旦操作开始,那么它一定可以在可能发生的“上下文切换”之前执行完毕。依赖于原子性是很棘手而且是很危险的。 原子性可以应用于除了long和double之外的所有基本类型之上的“简单操作
阅读全文
摘要:由于线程的本质特性,使得你不能捕获从线程中逃逸的异常,一旦异常逃出run()方法,他就会向外传播到控制台。除非采取特殊的步骤去捕获这种错误的异常,在JDK1.5以前,可以只用线程组来捕获,但在这之后,可以使用Executor来解决这个问题,下面示例如下: 输出结果: 如果加上try..catch也不
阅读全文
摘要:所谓守护线程(DaemonThread),是指在程序运行的时候在后台提供的一种通用的服务线程,并且这种线程并不属于程序中不可或缺的一部分。因此,当所有非守护线程(前台线程)都结束时,程序也就终止了。同时会杀死所有的后台线程,反过来说,只要又任何非守护线程还在执行,程序就不会终止,比如main()方法
阅读全文
摘要:输出结果:
阅读全文
摘要:1:Executor接口 2:ExecutorService接口 方法api: 下面通过实例来理解上述方法: 输出结果: 说明的第一个问题是:isShutdown()方法仅仅只是判断ExecutorService是否已经调用或shutDown()方法,如果是就返回true,否则返回false.而is
阅读全文
摘要:1:饿汉模式: 输出结果: 2:懒汉模式: 输出结果: 3:静置内部类: 输出结果 4:如果要保证对象序列化后仍然保持单利,那么代码如下: 输出结果: 5:使用静态代码块实现单利 输出结果:
阅读全文
摘要:翻译如下: 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。 如果只读数据,可以很多人同时读,但不能同时写,那就上读锁; 如果修改数据,只能有一个人在写,且不能同时读取,那就上写锁。 总之,读的时候上读锁,写的时候上写锁! ReentrantR
阅读全文
摘要:Condition共有一下几个api: awaitNanos()api: 翻译如下:
阅读全文
摘要:Lock接口提供了三种获取锁的能力。可中断,不可中断,定时。api文档如下: 输出结果:正常运行完毕,没有收到异常信息。 如果代码改为如下:那么会发生异常: 输出结果: 输出结果:可中断的异常能够接收到异常信息 输出结果: 分析:线程a获取锁时,锁是空闲的,那么会立即返回true.当线程b尝试获取锁
阅读全文
摘要:公平锁与非公平锁:公平锁代表获取锁的顺序时按照加入锁的顺序来分配的,即按照FIFO(first in first out)的顺序来的,而非公平锁就时一种抢占式,是随机分配的。不一定先到先地。这就有可能导致某些线程一致获取不到锁。 输出结果: 如果改为: 输出结果: 可见不是按照FIFO来进行分配地。
阅读全文
摘要:下面的翻译: 例子: 输出结果:test()与test2()实现了相同的效果: 关键字synchronized与wait(),notify()/notifyAll()相结合可以实现等待/通知模式。类ReentrantLock也可以实现相同的功能,但须要借助Condition对象。Condition类
阅读全文
摘要:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。再spring框架中大量使用。使用这个工具类可以很简洁地编写出优美的多线程程序。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会
阅读全文
摘要:在很多情况下,主线程创建并启动子线程,如果子线程中有大量的耗时运算,主线程将早于子线程结束,如果想让主线程等待子线程结束后再结束,那么我们可以使用join()方法。调用join()方法的意思是当前线程使调用了该方法的线程执行完成然后再执行自己本身。api文档如下: 简单翻译如下:调用该方法的线程会等
阅读全文
摘要:在线程里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了解决这个问题于是引入了生产者和消费者模式。下面
阅读全文
摘要:线程之间的通信可以通过共享内存变量的方式进行相互通信,也可以使用api提供的wait(),notify()实现线程之间的通信。wait()方法是Object类的方法,改方法用来将当前的线程置入"预执行队列"中,并且在wait()方法代码处停止执行进行等待,知道接收到同一个monitor对象的noti
阅读全文
摘要:输出结果: 一致处于阻塞状态,可以通过jps命令查看信息得到 然后再执行 jstack -l 8064 得到信息 死锁的一个经典场景为哲学家就餐问题。 产生死锁的原因主要是: (1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。如果系统资源充足,进程的资源请求都能够得
阅读全文
摘要:1.1、synchronized方法的弊端 输出结果: 当把同步方法改为同步代码块时, 输出结果: 可见,并没有提升效率,这是因为锁定的范围比较广,所以效果和锁方法的差别并不是太。那么可以缩小边界区,也就是资源真正开始竞争的地方。因为类中的成员变量才是资源的竞争对象,所以需要在访问这些变量的地方进行
阅读全文
摘要:非线程安全其实是在多个线程对同一个对象实例的变量进行并发访问的时候发生,产生的后果就是脏读,也就是取到的数据是修改过的。而线程安全就是获得的实例变量的值是经过同步处理的,从而不会出现脏读现象。 什么时候使用同步呢?可以运用Brian的同步规则: 1.1、同步语句 1.1.1、实例变量非线程安全 如果
阅读全文
摘要:在Thread类中有很多方法值得我们关注一下。下面选取几个进行范例: 1.1、isAlive()方法 java api 描述如下: 示例代码如下: 输出结果: 1->false3->true2->false 在main线程休眠3秒后,子线程此时已经结束。那么isAlive()方法放回为假。 1.2:
阅读全文
摘要:1.1、概念: 进程:进程是操作系统结构的基础,是一次程序的执行;是一个程序及其数据再处理器上顺序执行时所发生的活动;是程序再一个数据集合上运行的过程,它是系统进行系统资源分配和调度的最小单元。 线程:可以理解为一个程序的不同执行路径,是程序执行流的最小单元。线程是进程中的一个实体,是被系统独立调度
阅读全文

浙公网安备 33010602011771号