Java线程入门第二篇
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线程入门第二篇的更多相关文章
- Java线程入门第一篇
Java线程的状态有6种 1. 初始(NEW):新创建了一个线程对象,但还没有调用start()方法. 2. 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running) ...
- ElasticSearch入门 第二篇:集群配置
这是ElasticSearch 2.4 版本系列的第二篇: ElasticSearch入门 第一篇:Windows下安装ElasticSearch ElasticSearch入门 第二篇:集群配置 E ...
- Java正则表达式入门基础篇
正则表达式是一种可以用于模式匹配和替换的规范,一个正则表达式就是由普通的字符(例如字符a到z)以及特殊字符(元字符)组成的文字模式,它 用以描述在查找文字主体时待匹配的一个或多个字符串.正则表达式作为 ...
- java线程入门一
线程优先级: 在JAVA线程中,通过一个int型变量priority来控制线程优先级,线程的有限机为1-10,默认为5,优先级高的线程获得的运行时间要高于优先级低的线程.但这只是一个提示,操作系统和J ...
- java 线程池第一篇 之 ThreadPoolExcutor
一:什么是线程池? java 线程池是将大量的线程集中管理的类,包括对线程的创建,资源的管理,线程生命周期的管理.当系统中存在大量的异步任务的时候就考虑使用java线程池管理所有的线程.减少系统资源的 ...
- java线程入门知识
为什么需要多线程? . 模型的简化,如某些程序是由多个相对独立任务的运行: . 图形界面的出现,输入.输出的阻塞 . 多核CPU的更好利用 . 异步行为的需要 Java多线程的特性: . 程序的入口m ...
- Android JNI入门第二篇——Java参数类型与本地参数类型对照
前面一篇通过简单的例子介绍了android中JNI的使用.这一篇从基础上了解一些Java参数类型与本地参数类型区别. 1) java中的返回值void和JNI中的void是完全对应的哦! ...
- 新鲜出炉!JAVA线程池精华篇深度讲解,看完你还怕面试被问到吗?
前言 前两天趁着假期在整理粉丝私信的时候看到一个粉丝朋友的私信跟我说自己现在正在复习准备面试,自己在复习到线程池这一块的时候有点卡壳,总感觉自己差了点什么.想要我帮他指导一下.这不趁着假期我也有时间我 ...
- 并发包的线程池第二篇--Executors的构造
上一篇讲述了ThreadPoolExecutor的执行过程,我们也能看出来一个很明显的问题:这个线程池的构造函数比较复杂,对于不十分理解其运作原理的程序员,自己构造它可能体现和想象中不一样的行为.比如 ...
随机推荐
- eclipse打包jar文件
论文仿真做线性回归分类在人脸识别中应用与研究,在单机下实现LRC算法后,又在Hadoop云平台下实现了该算法.在比较实验结果时候需要放在相同硬件条件下比较.但是LRC单机算法是在windows下的ec ...
- LG的nexus5(32GB版本 - 821)-TOT-底包 可用于救砖!
LG的nexus5(32GB版本 - 821)-TOT-底包 底层修复效果完美,通过LGflashTool1.8直接刷进去就行~ 底包下载: https://pan.baidu.com/s/1Z5WD ...
- HTML实例(四)
实例一:有序列表,无序列表,<dl>,<dt>,<dd>,div块级标签等,实现上面的效果. <!DOCTYPE html> <html lang ...
- vscode 本地调试nodejs
1.首先通过node-inspect插件可以debug nodejs ,先起nodejs服务,再启用node-inpector服务 安装调试器 npm install -g node-inspec ...
- Centos7 DNS神奇的配置
文件 [root@iff etc]# cat /etc/named.conf // // named.conf // // Provided by Red Hat bind package to co ...
- [转] Linux History(历史)命令用法 15 例
[From]https://linuxtoy.org/archives/history-command-usage-examples.html 如果你经常使用 Linux 命令行,那么使用 histo ...
- 【HADR】常见的问题
[hadrpri@oc0644314035 ~]$ db2 start hadr on db org as primary SQL1768N Unable to start HADR. Reason ...
- java使用freemarker生成word文档
1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格 ...
- JS框架设计之对象类型判断一种子模块
Javascript有两套数据类型,一套是基础数据类型,一套是对象数据类型.基础数据类型包括5种基本数据类型,分别是null,bool,undefined,number,string,也叫简单数据类型 ...
- 安装TD出现Unknown user name or bad password问题
在Server 2003 sp2上安装TD8.0 出现Unknown user name or bad password,是因为2003启用了DEP保护. 关闭系统的DEP保护就可以了. 方法如下 ...