java并发之线程间通信
1、volatile 关键字
java 支持多个线程同时访问一个对象或对象的成员变量,而每个线程拥有这个变量的拷贝,虽然对象或成员变量分配的内存在共享内存,但每个执行的线程可以拥有一份拷贝,可以提高程序的执行效率,所以多线程看到的变量不一定是最新的。
volatile关键字可以保证程序对变量的每次读取都从共享内存读取,而对它的改变也必须同时刷新到共享内存。从而保证所有线程对变量访问的可见性。
但是过多的使用volatile关键字,会影响程序的执行效率。所以要谨慎使用
2、synchronized 关键字
synchronized可以修饰方法或者代码块,可以确保多个线程同一时刻只有线程处于方法或者同步快中。
synchronized本质是对对象的监视器(monitor)进行获取,而这个获取过程是排他性的。
3、 对象上的wait/notify
在当前线程执行对象的wait和notify方法,当前线程必须获取对象的监视器,如果没有获取对象的监视器,会报java.lang.IllegalMonitorStateException。一般的代码框架为
 synchronized (object){
            try {
                object.wait();
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
  synchronized (object){
            object.notify();
  }
执行object.wait()方法时,线程释放object的锁,然后将自己置于object监视器的等待队列;执行object.notify()方法,通知对象等待队列中的一个线程,使该线程由等待队列变为对象的监视器的同步队列,然后该线程尝试去获取object的监视器,获取后线程才能继续执行。
注意notify方法并没有释放对象的监视器,只是通知对象等待队列中一个对象由等待状态变为同步状态,等 synchronized 代码块执行完后,监视器才会释放
4、ThreadLocal
5、join
6、yield
7、sleep
8、intertupt()
java并发之线程间通信的更多相关文章
- java并发之线程间通信协作
		
在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者模型:当队列满时,生产者需要等待队列有空间才能继续往里面放入商品,而在等待的期间内,生产者必须释放对临界 ...
 - java多线程与线程间通信
		
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
 - Java多线程基础——线程间通信
		
在使用多线程的时候,经常需要多个线程进行协作来完成一件事情.在前面两章分析了Java多线程的基本使用以及利用synchronized来实现多个线程同步调用方法或者执行代码块.但上面两章的内容涉及到的例 ...
 - Java多线程:线程间通信之volatile与sychronized
		
由前文Java内存模型我们熟悉了Java的内存工作模式和线程间的交互规范,本篇从应用层面讲解Java线程间通信. Java为线程间通信提供了三个相关的关键字volatile, synchronized ...
 - Java多线程:线程间通信之Lock
		
Java 5 之后,Java在内置关键字sychronized的基础上又增加了一个新的处理锁的方式,Lock类. 由于在Java线程间通信:volatile与sychronized中,我们已经详细的了 ...
 - Java 如何实现线程间通信?(notify、join、CountdownLatch、CyclicBarrier、FutureTask、Callable )
		
转自:https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247486499&idx=1&sn=d3f2d6959df ...
 - Java 如何实现线程间通信
		
正常情况下,每个子线程完成各自的任务就可以结束了.不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了. 本文涉及到的知识点: thread.join(), object. ...
 - Java——多线程之线程间通信
		
Java多线系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多线 ...
 - java多线程:线程间通信——生产者消费者模型
		
一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是,多个线程之间如何协作呢? 我们看一个仓库 ...
 
随机推荐
- LiDAR、LAS、LAS  Dataset与点云
			
LiDAR Light Detection And Ranging,激光探测及测距,是一种光学遥感技术,使用激光对地球表面的密集采样,产生高精度X.Y.Z测量值. 激光雷达系统的主要硬件组成部分包括一 ...
 - webapi 统一处理时间格式
			
public class UnixDateTimeConvertor : DateTimeConverterBase { public override object ReadJson(JsonRea ...
 - 我的海外购页面List
			
<%@ page language="java" contentType="text/html;charset=UTF-8" %> <%@ t ...
 - POI导出Excel发现不可读取的内容
			
环境说明:MyEclipse Tomcat7.0 通过后台查询数据,导出Excel在打开时会出现以下提示: 点击否,则不显示任何内容,点击是,弹出 查看修改记录为: 通过WPS打开不会出现任何提示,可 ...
 - Spring AOP的简单示例
			
配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://w ...
 - python根据字符串导入模块
			
问题: path = "auth.my_auth.AUTH" # 根据path实例化AUTH类 解决: path = "auth.my_auth.AUTH" i ...
 - Tensorflow 的saved_model模块学习
			
saved_model模块主要用于TensorFlow Serving.TF Serving是一个将训练好的模型部署至生产环境的系统,主要的优点在于可以保持Server端与API不变的情况下,部署新的 ...
 - 【Python全栈-后端开发】Django进阶1-分页
			
Django[进阶篇-1 ]分页 分页 一.Django内置分页 from django.core.paginator import Paginator, EmptyPage, PageNotAnIn ...
 - Spring Boot 配置_yaml语法介绍 day02
			
一.Spring Boot 的全局配置文件(application.properties.application.yml) 1.这两种配置文件是SpringBoot 支持的对默认配置修改的格式.命名和 ...
 - DjangoMTV模型之model层——ORM操作数据库(基本增删改查)
			
Django的数据库相关操作 对象关系映射(英语:(Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说 ...