Java线程通信方法

0、(why)每个线程都有自己的栈空间,我们要线程之间进行交流,合作共赢。

1、synchronized和volatile关键字

  a)  看下面的synchronized关键字

  b)  看下面的volatile关键字

2、等待/通知机制:一个线程A调用对象的wait()方法,另一个线程调用线程B的notity()或者的notifyall()方法.

  a)  顺序打印奇数偶数

public class ThreadPrintDemo2 {

    public static void main(String[] args) {
final ThreadPrintDemo2 demo2 = new ThreadPrintDemo2();
//java8新特性
Thread t1 = new Thread(demo2 :: print1);
Thread t2 = new Thread(demo2 :: print2);
t1.start();
t2.start();
}
public synchronized void print2() { for (int i = ; i <= ; i +=) {
System.out.println(i);
this.notify(); //通知等待中的进程
try {
this.wait(); //线程进入等待
Thread.sleep();// 防止打印速度过快导致混乱
} catch (InterruptedException e) {
// NO
}
}
}
public synchronized void print1() {
for (int i = ; i <= ; i += ) {
System.out.println(i);
this.notify(); //通知等待中的进程
try {
this.wait(); //线程进入等待
Thread.sleep();// 防止打印速度过快导致混乱
} catch (InterruptedException e) {
// NO
}
}
}
}

  b) 打印连续句子

public class ThreadPrintDemo2 {
private char[] arr = new char[]{'a', ' ', 'b', 'c', 'd', 'e'}; public static void main(String[] args) {
final ThreadPrintDemo2 demo2 = new ThreadPrintDemo2();
Thread t1 = new Thread(demo2::print1);
Thread t2 = new Thread(demo2::print2);
t1.start();
t2.start();
}
public synchronized void print2() { for (int i = ; i < arr.length; i +=) {
System.out.print(arr[i]);
this.notify();
try {
this.wait();
Thread.sleep();// 防止打印速度过快导致混乱
} catch (InterruptedException e) {
// NO
}
}
}
public synchronized void print1() {
for (int i = ; i < arr.length; i +=) {
System.out.print(arr[i]);
this.notify();
try {
this.wait();
Thread.sleep();// 防止打印速度过快导致混乱
} catch (InterruptedException e) {
// NO
}
}
}
}

结果:a bcde

3、管道输入输出流:pipedreader和pipedwriter 面向字符

          Pipedoutputstream和pipedinputstream面向字节

4、使用thread.join()方法:利用线程等待特性

5、使用ThreadLocal线程变量

Synchronize关键字(重量级锁)

1、基础:Java中每一个对象都可以作为锁

2、手段:确保多线程在同一时刻,只有一个线程处于方法或同步块中

3、实现原理:JVM基于进入和退出monitor对象来实现方法同步和代码块同步

4、锁优化:jdk1.6之后优化了锁,加入了偏向锁和轻量级锁,锁可以升级但不能降级

5、使用场景:方法  代码块

Lock接口

1、他是一个接口

2、使用的时候需要显式获取锁

3、使用方法:

Lock lock = new ReentrantLock();
lock.lock();
try { }finally {
lock.unlock();
}

4、Synchronized经常与Lock放在一起比较

Volatile

1、是什么:(what)是轻且量级的synchronize,保证共享变量的可见性(一个线程修改一个共享变量的时候,另一个线程会知道),并他不会引起线程的上下文切换和调度。

2、使用场景:修饰变量

3、优化:在1.7中将共享变量追加了60个字节,变成64个字节。因为(硬件)目前流行的cpu的高速缓存行是64个字节,当队列的头尾节点不足64字节时候,处理器会将他们读到同一个缓存行,并且锁定缓存行。这样会影响队列出队入队效率。

ThreadLoacl类(线程变量)

为每个线程变量创建一个该变量的副本,避免并发访问的线程安全问题,保证线程安全

Java线程入门第二篇的更多相关文章

  1. Java线程入门第一篇

    Java线程的状态有6种 1.  初始(NEW):新创建了一个线程对象,但还没有调用start()方法. 2.  运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running) ...

  2. ElasticSearch入门 第二篇:集群配置

    这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...

  3. Java正则表达式入门基础篇

    正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...

  4. java线程入门一

    线程优先级: 在JAVA线程中,通过一个int型变量priority来控制线程优先级,线程的有限机为1-10,默认为5,优先级高的线程获得的运行时间要高于优先级低的线程.但这只是一个提示,操作系统和J ...

  5. java 线程池第一篇 之 ThreadPoolExcutor

    一:什么是线程池? java 线程池是将大量的线程集中管理的类,包括对线程的创建,资源的管理,线程生命周期的管理.当系统中存在大量的异步任务的时候就考虑使用java线程池管理所有的线程.减少系统资源的 ...

  6. java线程入门知识

    为什么需要多线程? . 模型的简化,如某些程序是由多个相对独立任务的运行: . 图形界面的出现,输入.输出的阻塞 . 多核CPU的更好利用 . 异步行为的需要 Java多线程的特性: . 程序的入口m ...

  7. Android JNI入门第二篇——Java参数类型与本地参数类型对照

    前面一篇通过简单的例子介绍了android中JNI的使用.这一篇从基础上了解一些Java参数类型与本地参数类型区别. 1)        java中的返回值void和JNI中的void是完全对应的哦! ...

  8. 新鲜出炉!JAVA线程池精华篇深度讲解,看完你还怕面试被问到吗?

    前言 前两天趁着假期在整理粉丝私信的时候看到一个粉丝朋友的私信跟我说自己现在正在复习准备面试,自己在复习到线程池这一块的时候有点卡壳,总感觉自己差了点什么.想要我帮他指导一下.这不趁着假期我也有时间我 ...

  9. 并发包的线程池第二篇--Executors的构造

    上一篇讲述了ThreadPoolExecutor的执行过程,我们也能看出来一个很明显的问题:这个线程池的构造函数比较复杂,对于不十分理解其运作原理的程序员,自己构造它可能体现和想象中不一样的行为.比如 ...

随机推荐

  1. 关于Tomcat控制台乱码解决办法___ 解决 IntelliJ IDEA Tomcat 控制台中文输出乱码问题

    Tomcat 控制台UTF-8乱码问题 1.修改cmd的编码格式 快捷键win+R打开运行程序,输入regedit打开注册表,找到以下路劲并且修改. [HKEY_LOCAL_MACHINE\SOFTW ...

  2. P5277 【模板】多项式开根(加强版)(bsgs or Cipolla)

    题面 传送门 题解 首先你得会多项式开根->这里 其次你得会解形如 \[x^2\equiv a \pmod{p}\] 的方程 这里有两种方法,一个是\(bsgs\)(这里),还有一种是\(Cip ...

  3. [ActionScript3.0] AS3利用ExternalInterface与js通信

    AS3代码,可做文档类; package { import flash.display.Sprite; import flash.events.*; import flash.external.Ext ...

  4. angular核心原理解析3:指令的执行过程

    指令的执行过程分析. 我们知道指令的执行分两个阶段,一个是compile,一个是link. 我们可以在指令中自定义compile和link. 首先,我们来讲解如何自定义link函数 举个例子: < ...

  5. Windows 断开CIFS共享出现 “此网络连接不存在”

    Windows 断开CIFS共享出现 "此网络连接不存在" 首先请您尝试 net use * /delete /y 命令,若无效本文就是为您准备的. 检查是否是因为用户被设置共享桌 ...

  6. jvm学习笔记(一)

    一.java的运行原理 开发人员编写java代码(.java文件) 编译器将.java文件编译成字节码文件(.class文件) 字节码被装入内存,当字节码被装入内存之后,它就会被解释器解释执行或是被即 ...

  7. 关于ajax学习

    一.Ajax是XMLHttpRequest对象,javascript,XML,CSS,DOM等多种技术的组合 1.XML :(可扩展的标记语言) 提供了用于描述结构化数据的格式,适用于不同应用间的数据 ...

  8. [HNOI2019]多边形

    Luogu5288 注意:n边形里共有n-3条边 最优步数=不与n相连的边数,关键是方案数. 按照处理顺序可以转化为树形结构即二叉树森林,转移方案数用组合数即可 关键是快速处理修改. 1.最优解减少一 ...

  9. 【算法笔记】A1054 The Dominant Color

    1054 The Dominant Color (20 分)   Behind the scenes in the computer's memory, color is always talked ...

  10. Java异常机制关键字总结,及throws 和 throw 的区别

    在Java的异常机制中,时常出现五个关键字:try , catch , throw , throws , finally. 下面将总结各个关键字的用法,以及throw和throws的区别: (1) t ...