记录面试过程中被问到的几个需要手写代码的小案例

1.请手写出线程的等待唤醒机制

案例中两个线程:SyncSetThread设置学生信息,SyncGetThread用来获取学生信息,在Student实体中提供一个标记属性flag,记录当前是否有数据。

等待唤醒机制

设置信息线程SyncSetThread

/*

* 使用Object的wait() 和 notify() 来实现等待唤醒机制

* Created by JackYang on 2017/10/17.

*/

class SyncSetThread implements Runnable {

private final Student student;

SyncSetThread(Student student) {

this.student = student;

}

@Override

public void run() {

int num = 0;

while (true) {

synchronized (student) {

if (student.flag) {

try {

student.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

if (num % 2 == 0) {

student.name = "JackYang";

student.age = 26;

} else {

student.name = "江一燕";

student.age = 28;

}

++num;

student.flag = true;

student.notify();

//此时唤醒,SyncSetThread和SyncGetThread两个线程都有同等的机会去抢占资源

}

}

}

}

获取信息线程SyncGetThread

class SyncGetThread implements Runnable {

private final Student student;

SyncGetThread(Student student) {

this.student = student;

}

@Override

public void run() {

while (true) {

synchronized (student) {

if (!student.flag) {

try {

//对象中没有数据的时候就等待

student.wait();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

System.out.println(student.name + "---" + student.age);

//数据消费完了(取出后)改变标记

student.flag = false;

student.notify();

//此时唤醒,SyncSetThread和SyncGetThread两个线程都有同等的机会去抢占资源

}

}

}

}

测试入口

/*

* 线程的等待唤醒机制,实现一人一次有规律

* Created by JackYang on 2017/10/17.

*/

public class TestSyncThread {

public static void main(String[] args) {

Student student = new Student();

SyncSetThread syncSetThread = new SyncSetThread(student);

SyncGetThread syncGetThread = new SyncGetThread(student);

Thread thread1 = new Thread(syncSetThread);

Thread thread2 = new Thread(syncGetThread);

thread1.start();

thread2.start();

}

}

2.请手写出线程死锁代码

这个没得商量,直接上代码

/**

* 死锁代码

* Created by JackYang on 2017/10/17.

*/

class DieThread extends Thread {

private boolean flag;

DieThread(boolean flag) {

this.flag = flag;

}

@Override

public void run() {

if (flag) {

//防止一次卡不住

while (true) {

synchronized (MyLock.lockA) {

System.out.println("true lockA");

synchronized (MyLock.lockB) {

System.out.println("true lockB");

}

}

}

} else {

while (true) {

synchronized (MyLock.lockB) {

System.out.println("false lockB");

synchronized (MyLock.lockA) {

System.out.println("false lockA");

}

}

}

}

}

}

java 等待唤醒机制,Java线程等待唤醒机制相关推荐

  1. 【小白学java】D36》》》线程入门学习,线程同步机制 和 线程等待与唤醒机制

  2. java 添加等待时间_Java中线程等待特定时间的最有效方法 - java

    我知道这个问题here,但是我有一个稍微不同的问题.如果我希望自己通过各种Thread方法(而不是通过实用程序类或Quartz)手动编码某个线程在特定时间的运行,那么最有效(就开销而言)进行编码. 我 ...

  3. java队列等待唤醒_Java深入学习29:线程等待和唤醒的两个方案

    Java深入学习29:线程等待和唤醒的两个方案 模拟场景 一个门店,有一个店员,有消费者来消费商品(每次消费1件商品),有仓库人员来添加(生产)商品(每次生产1件商品),并假设库存上限是2. 基础代码 ...

  4. 菜鸟学习笔记:Java提升篇8(线程2——线程的基本信息、线程安全、死锁、生产者消费者模式、任务调度)

    菜鸟学习笔记:Java提升篇8(线程2--线程的基本信息.线程安全.死锁.生产者消费者模式.任务调度) 线程的基本信息 线程同步 线程安全 死锁 生产者消费者模式 任务调度(了解) 线程的基本信息 J ...

  5. python线程的注意点(线程之间执行是无序的、主线程会等待所有的子线程执行结束再结束(守护主线程)、线程之间共享全局变量、线程之间共享全局变量数据出现错误问题(线程等待(join)、互斥锁))

    1. 线程的注意点介绍 线程之间执行是无序的 主线程会等待所有的子线程执行结束再结束 线程之间共享全局变量 线程之间共享全局变量数据出现错误问题 2. 线程之间执行是无序的 import thread ...

  6. java基础提升(二):多线程、线程安全、线程状态、等待唤醒机制、线程池

    目录 一. 多线程 1.1并发与并行 1.2 线程与进程 1.3 创建线程类 1.3.1 方式一:继承Thread类 1.3.2 方式二:实现Runnable接口 1.3.3 Thread和Runna ...

  7. Java线程等待唤醒机制(加深理解)

    今天看源码的时候遇到这样一个场景,某线程里面的逻辑需要等待异步处理结果返回后才能继续执行.或者说想要把一个异步的操作封装成一个同步的过程.这里就用到了线程等待唤醒机制,下面具体看一下. 等待唤醒机制示 ...

  8. Java虚拟机(JVM)与Java内存模型(JMM)学习笔记

    Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...

  9. 深入理解JVM之代码执行机制与线程资源同步及交互机制

    Java规范定义标准结构如图3.1 Java代码的执行机制 Java源码编译机制 javac将Java源码编译为class文件的步骤如图3.2 1.分析和输入到符号表(Parse and Enter) ...

  10. java sleep唤醒_Java中的等待唤醒机制—至少50%的工程师还没掌握!

    Java中的等待唤醒机制-至少50%的工程师还没掌握! 发布时间:2019-12-14 01:53, 浏览次数:222 , 标签: Java 这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新 ...

最新文章

  1. 嵌入式linux开发课程设计,嵌入式Linux开发课程设计指导书
  2. C++输入函数的应用
  3. javascript学习系列(18):数组中的include方法
  4. Version Control
  5. Hadoop 2.2.0 在centos6.2 64位下的安装--分布式模式
  6. CTreeCtrl 类的InsertItem成员函数
  7. Nginx主配置文件的优化-nginx主配置文件的优化
  8. week15-字符串
  9. Mac 忘记管理员名和密码
  10. 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的求职之路
  11. Win8快捷键收集大汇总
  12. 总结Criteria的简要使用概述(Hibernate5.2+)
  13. linux 防火墙 功能点,功能点(Funciton Point FP)估算法(三) 调整因子
  14. electron 设置窗口默认最大化、全屏
  15. 原生javascript-图片查看器的制作-注释版
  16. No matching version found for @soda/friendly-errors-webpack-plugin@1.8.0.
  17. 腾讯通服务器删除离线消息,如何撤回RTX离线消息离线文件.docx
  18. flutter 实现切屏横竖屏切换
  19. SAP GUI 登录语言设置
  20. 以问题为导向剖析一些矩阵等价类的本质(合同篇)

热门文章

  1. cockroachdb mysql_CockroachDB学习笔记——[译]CockroachDB中的SQL:映射表中数据到键值存储...
  2. MySQL 修改数据
  3. fetch用英语解释_fetch的意思在线翻译,解释fetch中文英文含义,短语词组,音标读音,例句,词源,同义词【澳典网ODict.Net】...
  4. java中的single_解析java泛型(一)
  5. idea junit 测试看不到控制台报错信息_高手都这么给 Spring MVC 做单元测试!
  6. 不同存储结构的文件磁盘io操作次数_MySQL InnoDB存储引擎
  7. python docker_Docker实践:python应用容器化
  8. react实现全选和反选_全选的实现
  9. mysql中教如何拼接字段(列)值、加入运算、设置别名(非常实用)
  10. DATA SHARING Help JetBrains improve its products by sending anonymous data about features and plugin