作为一个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)相关推荐

  1. Java核心知识点 --- 线程中如何创建锁和使用锁 Lock , 设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  2. 【韩顺平】Java线程(基础)知识点总结

    文章目录 1.线程概念 1.1程序 1.2进程 1.3线程 2.其他相关概念 2.1并发 2.2并行 2.3单线程 2.4多线程 3.创建线程的两种方法 3.1继承Thread类,重写run方法 3. ...

  3. 干货分享 JVM 之第 1 篇 —— Java 线程的重要知识点大全

    线程与进程区别 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所以线程基本上是轻量 ...

  4. java基础知识点_「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    " 本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指 ...

  5. java线程 同步与异步 线程池

    1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...

  6. java线程池的使用例子,不愧是大佬

    京东Java研发岗一面(基础面,约1小时) 自我介绍,主要讲讲做了什么和擅长什么 springmvc和spring-boot区别 @Autowired的实现原理 Bean的默认作用范围是什么?其他的作 ...

  7. Java 面试知识点解析(六)——数据库篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  8. Java 面试知识点解析(三)——JVM篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  9. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  10. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

最新文章

  1. watch监听对象里面值的变化_Vue总结——computed和watch的用法和区别
  2. python--lambda和def函数
  3. 【报告下载】想要评测 Kylin和Vertica的性能?这份基准测试白皮书已经替你做到了...
  4. dobbo 管理端端口_安装 Dubbo 管理控制台
  5. python 常见函数_Python基础函数:初学者常用的十个Python函数,非常全面!
  6. 正则表达式入门之字符匹配
  7. leetcode41 缺失的第一个正数
  8. HA机制的大数据集群的搭建过程
  9. 《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN
  10. tcp协议之三次握手,四次挥手
  11. 小程序wx.uploadFile 显示errMsg: uploadFile:fail Error: Parse Error
  12. BZOJ4568 [Scoi2016]幸运数字
  13. [日推荐]『拉勾招聘』手机APP可以卸掉啦!
  14. 我们数学中常用的自然常数e代表什么?看完长知识了!
  15. WIN10电脑升级显卡驱动后变慢不少
  16. Qt 周立功can二次开发
  17. Web开发者的实用网址
  18. 使用证件照api接口快速上线证件照业务-超详细!
  19. 【深度学习知识】常见的梯度下降算法原理
  20. 小菜鸟之oracle数据字典

热门文章

  1. grafana导入json文件没有数据_基于SpringBoot将Json数据导入到数据库
  2. idesk卸载教程_iDesk助手使用帮助
  3. torch 默认参数初始化_Detection学习之九-torch中如何定义优化器及调整学习率
  4. 电脑投屏电视怎么设置_手机投屏怎么设置全屏
  5. SQL:一条SQL的查询结果作为另一条SQL的查询条件
  6. 爬虫:Python爬虫学习笔记之网页解析基础——爬取360导航栏目
  7. 常用PDF文档开发库
  8. Python Numpy中reshape函数参数-1的含义
  9. 深度学习中常见的Normalization总结—Batch Normalization,Instance Normalization
  10. 【实例分割论文】SOLOv2: Dynamic, Faster and Stronger