java线程知识点拾遗(1)
作为一个android开发者的我来说,面试最怕问的问题就是问多线程方面的,问之必死~~。因为android monkey在开发中多线程开发的场景使用起来几乎没有,所以就滋生了自己的懒惰性,人家说哪里跌倒哪里爬起来,这工作几年了也没爬起来,有点小羞愧。于是准备抽点时间好好研究下这个东东。
不要逼我,逼急了我什么都能做出来! 来来来,现场手写一个自旋锁出来试试!卒!
在多线程的编程中,如果需要加锁的情况下,通常需要synchronized来搞定(当然这是最初级的用法)用来确保线程安全,比如HashTable这个在开发中没怎么用过的组件,看其源码可以发现其public方法都加了synchronized来搞定;所以说HashTable是线程安全的。
在我们处理多线程并发的时候可能会经常这么写(这也是wait和notify notify All的正确使用姿势):
Object lock = new Object();
synchronized (lock) { while (condition is not ok) { // 条件不满足,当前线程阻塞等待lock.wait(); } // 执行条件满足时的逻辑doSomething();// 通知阻塞的线程可以唤醒lock.notify();
}
简单举一个例子来说明,以前博主面试遇到过这个问题:两个线程交替打印奇数和偶数。
思路也很简单,因为是线程交替执行,所以当前数字是偶数的时候就让奇数线程wait,当前数字是奇数的时候就让偶数线程wait
打印奇数的线程
private Object lock = new Object();
private int i = 0;// 打印奇数class PrintOdd implements Runnable {@Overridepublic void run() {synchronized (lock) {while (i <= 40) {if (i % 2 == 1) {System.out.println("打印奇数==" + i);i++;//通知偶数线程工作lock.notify();} else {//当前是偶数,线程等待try {lock.wait();} catch (InterruptedException e) {}}} // end while} // end synchronized}//end run }
打印偶数线程:
class PrintEven implements Runnable {@Overridepublic void run() {synchronized (lock) {while (i <= 40) {if (i % 2 == 0) {System.out.println("打印偶数************ " + i);i++;//通知奇数线程lock.notify();} else {try {lock.wait();} catch (InterruptedException e) {}}} // end while} // end synchronized}//end run }
上面就是简单的利用了wait和notify方法,其实还有一个更简单的写法,如下所示:
volatile boolean printOdd=true;private int i=0;// 打印奇数class PrintOdd implements Runnable {@Overridepublic void run() {while(i<40) {if(printOdd) {System.out.println("打印奇数---------------"+i);i++;//开始打印偶数printOdd=false;}}}}class PrintEven implements Runnable {@Overridepublic void run() {while(i<40) {if(!printOdd) {System.out.println("打印偶数*********"+ i);i++;//开始打印奇数printOdd=true;}}}// end run}
甚至可以把上面的i用AtomicInteger来替换,那么代码就如下所示:
volatile boolean printOdd=true;private AtomicInteger i=new AtomicInteger();// 打印奇数class PrintOdd implements Runnable {@Overridepublic void run() {while(i.get()<4000) {if(printOdd) {System.out.println("打印奇数---------------"+i.getAndIncrement());//开始打印偶数printOdd=false;}}}}class PrintEven implements Runnable {@Overridepublic void run() {while(i.get()<4000) {if(!printOdd) {System.out.println("打印偶数*********"+ i.getAndIncrement());//开始打印奇数printOdd=true;}}}// end run}
java线程知识点拾遗(1)相关推荐
- Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统
理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...
- 【韩顺平】Java线程(基础)知识点总结
文章目录 1.线程概念 1.1程序 1.2进程 1.3线程 2.其他相关概念 2.1并发 2.2并行 2.3单线程 2.4多线程 3.创建线程的两种方法 3.1继承Thread类,重写run方法 3. ...
- 干货分享 JVM 之第 1 篇 —— Java 线程的重要知识点大全
线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是轻量 ...
- java基础知识点_「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !
" 本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指 ...
- java线程 同步与异步 线程池
1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...
- java线程池的使用例子,不愧是大佬
京东Java研发岗一面(基础面,约1小时) 自我介绍,主要讲讲做了什么和擅长什么 springmvc和spring-boot区别 @Autowired的实现原理 Bean的默认作用范围是什么?其他的作 ...
- Java 面试知识点解析(六)——数据库篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(三)——JVM篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(一)——基础知识篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
最新文章
- watch监听对象里面值的变化_Vue总结——computed和watch的用法和区别
- python--lambda和def函数
- 【报告下载】想要评测 Kylin和Vertica的性能?这份基准测试白皮书已经替你做到了...
- dobbo 管理端端口_安装 Dubbo 管理控制台
- python 常见函数_Python基础函数:初学者常用的十个Python函数,非常全面!
- 正则表达式入门之字符匹配
- leetcode41 缺失的第一个正数
- HA机制的大数据集群的搭建过程
- 《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN
- tcp协议之三次握手,四次挥手
- 小程序wx.uploadFile 显示errMsg: uploadFile:fail Error: Parse Error
- BZOJ4568 [Scoi2016]幸运数字
- [日推荐]『拉勾招聘』手机APP可以卸掉啦!
- 我们数学中常用的自然常数e代表什么?看完长知识了!
- WIN10电脑升级显卡驱动后变慢不少
- Qt 周立功can二次开发
- Web开发者的实用网址
- 使用证件照api接口快速上线证件照业务-超详细!
- 【深度学习知识】常见的梯度下降算法原理
- 小菜鸟之oracle数据字典
热门文章
- grafana导入json文件没有数据_基于SpringBoot将Json数据导入到数据库
- idesk卸载教程_iDesk助手使用帮助
- torch 默认参数初始化_Detection学习之九-torch中如何定义优化器及调整学习率
- 电脑投屏电视怎么设置_手机投屏怎么设置全屏
- SQL:一条SQL的查询结果作为另一条SQL的查询条件
- 爬虫:Python爬虫学习笔记之网页解析基础——爬取360导航栏目
- 常用PDF文档开发库
- Python Numpy中reshape函数参数-1的含义
- 深度学习中常见的Normalization总结—Batch Normalization,Instance Normalization
- 【实例分割论文】SOLOv2: Dynamic, Faster and Stronger