一.锁 1.锁的概念   线程安全问题的产生是因为多个线程并发访问共享数据造成的,如果能将多个线程对共享数据的并发访问改为串行访问,即一个共享数据同一时刻只能被一个线程访问,就可以避免线程安全问题.锁正是基于这种思路实现的一种线程同步机制.   在对共享数据加锁后,每个线程在访问共享数据时必须先申请相应的锁.一旦获得锁后,就可以访问共享数据,并且一个锁同一时刻只能被一个线程持有,这意味着获得锁后不会有其他线程再访问共享数据.访问共享数据结束后线程必须释放锁.锁的持有线程在其获得锁之后和释放锁之前…
一.等待与通知   某些情况下,程序要执行的操作需要满足一定的条件(下文统一将其称之为保护条件)才能执行.在单线程编程中,我们可以使用轮询的方式来实现,即频繁地判断是否满足保护条件,若不满足则继续判断,若满足则开始执行.但在多线程编程中,这种方式无疑是非常低效的.如果一个线程持续进行无意义的判断而不释放CPU,这就会造成资源的浪费:而如果定时去判断,不满足保护条件就释放CPU,又会造成频繁的上下文切换.总之,不推荐在多线程编程中使用轮询的方式.   等待与通知是这样一种机制:当保护条件不满足时,…
一.线程安全性   一般而言,如果一个类在单线程环境下能够运作正常,并且在多线程环境下,在其使用方不必为其做任何改变的情况下也能运作正常,那么我们就称其是线程安全的.反之,如果一个类在单线程环境下运作正常而在多线程环境下则无法正常运作,那么这个类就是非线程安全的.因此, 一个类如果能够导致竞态,那么它就是非线程安全的:而一个类如果是线程安全的,那么它就不会导致竞态.下面是<Java并发编程实战>一书中给出的对于线程安全的定义: 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程…
  因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式.   在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据(可能是消息.文件.任务等),这些数据由另一个模块来负责处理.产生数据的模块,就形象地被称为生产者:而处理数据的模块,就被称为消费者.   单单抽象出生产者和消费者,还称不上是生产者/消费者模式.该模式还需要有一个缓冲区处于生产者和消费者之间来作为一个中介.生产者把数据放入缓冲…
通过管道进行线程间通信:字节流 Java提供了各种各样的输入/输出流Stream可以很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据,一个线程发送数据到输出管道,另一个线程从输入管道中读数据.通过使用管道,实现不同线程间的通信,无需借助于类似临时文件之类的东西. JDK提供了4个类来使线程间可以进行通信: PipedInputStream和PipedOutputStream PipedReader和PipedWriter public cla…
线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控监督. 等待通知机制 在调用wait()之前,线程必须获得该对象的对象级别锁,即只能在同步方法或同步代码块中调用wait()方法.在执行wait()方法后,当前线程释放锁,在从wait()返回之前,线程与其他线程竞争重新获得锁. public class Thre…
不使用等待通知机制 实现线程间通信的 疑问分析 2018年04月03日 17:15:08       ayf 阅读数:33 编辑 <java多线程编程核心技术>一书第三章开头,有如下案例: 线程A: package extthread; import mylist.MyList; public class ThreadA extends Thread { private MyList list; public ThreadA(MyList list) { super(); this.list…
<Java多线程编程核心技术> @author ergwang https://www.cnblogs.com/ergwang/ 文章末尾附pdf和png下载链接 第1章 Java多线程技能 1. 进程与线程 区别? 联系? 这篇博客记录了 https://www.cnblogs.com/ergwang/p/15997503.html 2. 创建多线程的方式,有几种?怎么创建 继承Thread类 (一般不单独用) 实现Runnable接口 + Thread对象 实现Callable接口+Fut…
一.线程的交互 a.线程交互的基础知识 线程交互知识点需要从java.lang.Object的类的三个方法来学习:    void notify()           唤醒在此对象监视器上等待的单个线程(notify()方法调用的时候,锁并没有被释放).  void notifyAll()           唤醒在此对象监视器上等待的所有线程.  void wait()           导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法(…
转自:http://programming.iteye.com/blog/158568 线程的同步 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法和 synchro…