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的执行过程,我们也能看出来一个很明显的问题:这个线程池的构造函数比较复杂,对于不十分理解其运作原理的程序员,自己构造它可能体现和想象中不一样的行为.比如 ...
随机推荐
- python学习笔记-控制流(if for while break continue)
if语句 if语句用以检查条件:如果条件为真(True),将运行一块语句(称作 if-block 或 if 块),否则将运行另一块语句(称作 else-block 或 else 块).其中else 从 ...
- PHP性能优化四(业务逻辑中使用场景)
php脚本性能,很多时候依赖于你的php版本.你的web server环境和你的代码的复杂度. Hoare曾经说过“过早优化是一切不幸的根源”.当你想要让你的网站更快运转的时候,你才应该去做优化的事情 ...
- python学习,day4:生成器
1.生成器:只有在调用是才会生成相应的数据.(比较省内存,它只保留当时生成的.而列表会保存整个列表) a = [i*2 for i in range(10)] #列表生成式 print(a) 这样会把 ...
- loj 6433 「PKUSC2018」最大前缀和 题解【DP】【枚举】【二进制】【排列组合】
这是个什么集合DP啊- 想过枚举断点但是不会处理接下来的问题了- 我好菜啊 题目描述 小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和. 但是小 C 并不会做 ...
- HDU4641 || 6194多校 (后缀自动机-最少出现K次的字串个数 || 恰好出现K次字符串的个数)
http://acm.hdu.edu.cn/showproblem.php?pid=4641 http://acm.hdu.edu.cn/showproblem.php?pid=6194 题意: 开始 ...
- compact framework windows mobile wm c#代码 创建快捷方式
已经2018年了,windows mobile已经宣布不维护狠多年了,不要问我为什么还在开发windows mobile的程序,我也不想.公司有一批手持扫描枪设备依然是windows mobile的程 ...
- vSphere通过Client创建Centos7主机
准备: vSphere Client 客户端 Centos7官方镜像,本次采用的是CentOS-7-x86_64-Minimal-1511.iso 创建过程: 1.登录vSphere虚拟主机,输入账户 ...
- AMQP技术术语
什么是AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.基 ...
- 我爱Markdown (2)
Markdown的语法很简单,所以很容易上手.下面介绍一下常用的Markdown的语法, 本文将介绍: 01 - Back-ticks 反尖号 02 - Headers 标题 03 - Emphasi ...
- Integer源码分析
Integer中包含了大量的static方法. 1.分析Integer的缓存机制:首先定义了一个缓存区,IntegerCache,其实就是一个Integer数组cache[],它默认存储了从-128~ ...