需要理解锁是什么意思?

首先是发生在多线程的情况下;

线程a,线程b,共享资源share

例如,share的资源一次只能被一个对象操作,这时候需要一个东西来标识(也叫监视器)出来表明该资源已经有人(指的是线程)在使用了,请还要使用的人(指的是线程)进入等待(线程等待池/队列);

怎么实现呢?

synchronized关键字,配合一个唯一的东西,可以是类.class,也可以是对象本身;但注意的是必须是一个引用的数据类型,如包装类,obj等

1.生产者和消费者模式

代码演示:

重点练习1:

一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条。哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿到两只筷子才能吃饭.那思考必须 把两只筷子放回才可以思考.

重点练习2:

桌子上有一个空盘,允许存放1个水果.爸爸想其中放苹果也可以放橘子.儿子专门等吃橘子.女儿专门等吃苹果!

publicclassDemo {

classFriutPlate {

String name;

publicsynchronizedvoidaddFriut(String name) throwsInterruptedException {

while(this.name!= null) {

System.out.println("盘子里已经有"+ this.name+ "生产者暂停");

this.wait();

}

this.notifyAll();

this.name= name;

System.out.println("向水果盘中放入:"+ name);

Thread.sleep(100);

}

publicsynchronizedString getFriut() throwsInterruptedException {

while(this.name== null) {

System.out.println("盘子无水果,消费者暂停");

this.wait();

}

this.notifyAll();

System.out.println("盘子中的:"+ name+ "消费者准备消费");

Thread.sleep(100);

returnname;

}

publicvoidsetNameNull() {

name= null;

}

}

classProductApple implementsRunnable {

FriutPlate fp;

publicProductApple(FriutPlate fp) {

this.fp= fp;

}

@Override

publicvoidrun() {

try{

synchronized(fp) {

while(true) {

// System.out.println("正在往里放苹果");

fp.addFriut("苹果");

}

}

} catch(InterruptedException e) {

e.printStackTrace();

}

}

}

classProductOrange implementsRunnable {

FriutPlate fp;

publicProductOrange(FriutPlate fp) {

this.fp= fp;

}

@Override

publicvoidrun() {

try{

synchronized(fp) {

while(true) {

// System.out.println("正在往里放橘子");

fp.addFriut("橘子");

}

}

} catch(InterruptedException e) {

e.printStackTrace();

}

}

}

classConsumerApple implementsRunnable {

FriutPlate fp;

publicConsumerApple(FriutPlate fp) {

this.fp= fp;

}

@Override

publicvoidrun() {

while(true) {

synchronized(fp) {

String friutName= null;

try{

friutName= fp.getFriut();

} catch(InterruptedException e1) {

// TODOAuto-generated catch block

e1.printStackTrace();

}

if("苹果".equals(friutName)) {

System.out.println("儿子吃掉苹果");

fp.setNameNull();

} else{

System.out.println("不是苹果,儿子不吃");

try{

Thread.sleep(100);

} catch(InterruptedException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

}

}

}

}

}

classConsumerOrange implementsRunnable {

FriutPlate fp;

publicConsumerOrange(FriutPlate fp) {

this.fp= fp;

}

@Override

publicvoidrun() {

while(true) {

synchronized(fp) {

String friutName= null;

try{

friutName= fp.getFriut();

} catch(InterruptedException e1) {

// TODOAuto-generated catch block

e1.printStackTrace();

}

if("橘子".equals(friutName)) {

System.out.println("女儿吃掉橘子");

fp.setNameNull();

} else{

System.out.println("不是橘子,女儿不吃");

try{

Thread.sleep(100);

} catch(InterruptedException e) {

// TODOAuto-generated catch block

e.printStackTrace();

}

}

}

}

}

}

publicstaticvoidmain(String[] args) {

Demo d= newDemo();

FriutPlate fp= d.newFriutPlate();

ProductApple pa= d.newProductApple(fp);

ProductOrange po= d.newProductOrange(fp);

ConsumerApple ca= d.newConsumerApple(fp);

ConsumerOrange co= d.newConsumerOrange(fp);

Thread t1= newThread(pa);

Thread t2= newThread(po);

Thread t3= newThread(ca);

Thread t4= newThread(co);

t1.start();

t2.start();

t3.start();

t4.start();

}

}

练习:三个线程轮流打印ABC

练习:死锁演示

1.当线程为2个时,锁为一个时,很少出现死锁

2.当线程为3个时,使用notify()唤醒,极大可能出现死锁

3.当线程A在sync(a)-sync(b)时,线程B在sync(b)-sync(a)时,这种嵌套锁,一定会出现死锁

java多线程嵌套_Java多线程进阶相关推荐

  1. java线程钥匙_Java多线程并发编程/锁的理解

    一.前言 最近项目遇到多线程并发的情景(并发抢单&恢复库存并行),代码在正常情况下运行没有什么问题,在高并发压测下会出现:库存超发/总库存与sku库存对不上等各种问题. 在运用了 限流/加锁等 ...

  2. java线程 教程_Java多线程系列教程

    Java多线程系列教程 多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容是对Java多线程内容的讲解,涉及到的内容包括,Object类中的wait(), n ...

  3. java 多线程 总结_Java 多线程总结

    昨天熬了个通宵,看了一晚上的视频,把java 的多线程相关技术重新复习了一遍,下面对学习过程中遇到的知识点进行下总结. 首先我们先来了解一下进程.线程.并发执行的概念: 进程是指:一个内存中运行的应用 ...

  4. java线程入门_java多线程快速入门(一)

    1.什么是进程 比如:QQ.QQ游戏.eclipse都是进程,可以通过任务管理器查看进程 2.进程和线程区别 线程是进程的一部分,一个进程可以包含多个线程,一个线程只能属于一个进程 进程是所有线程的集 ...

  5. java 高效的多线程同步_java多线程的同步和异步

    java多线程的同步和异步 Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言.Java 技术具有卓越的通用性.高效性.平台移植性和安全性,广泛应用于PC.数据中心.游戏控制台.科学超级计算 ...

  6. java的多线程机制_Java多线程开发(一)| 基本的线程机制

    0. 前言 Java 为了实现跨平台,在语言层面上实现了多线程.我们只需要熟悉 Java 这一套多线程机制就行了,比 C/C++ 要容易多了. 1. 定义任务 我们编写程序,最终是为了完成特定的任务. ...

  7. java for 嵌套_Java中的for循环嵌套

    Java嵌套循环是指在一个循环语句的循环体中再定义一个循环语句的语法结构.whiledo.while.for循环语句都可以进行嵌套,并且它们之间也可以互相嵌套,如最常见的在for循环中嵌套for循环, ...

  8. java多线程编程_Java多线程编程实战指南+设计模式篇.pdf

    Java多线程编程实战指南+设计模式篇.pdf 对Java架构技术感兴趣的工程师朋友们可以关注我,转发此文后私信我"Java"获取更多Java编程PDF资料(附送视频精讲) 关注我 ...

  9. java并发多线程面试_Java多线程并发面试问答

    java并发多线程面试 Today we will go through Java Multithreading Interview Questions and Answers. We will al ...

最新文章

  1. centOS外部浏览器无法访问tomcat8000端口解决办法
  2. (转)Android ViewGroup的onInterceptTouchEvent()事件分析
  3. HDU-2159 FATE 二维背包
  4. php 模板 php + mysql + myodbc,连接MySQL数据库在ASP中,就用MyODBC
  5. 从信息检索顶会CIKM'20看搜索、推荐与计算广告新进展
  6. C# 操作IIS方法集合
  7. Tableau如何动态显示销售数据排名
  8. 缠中说缠,最好用的缠论画笔和中枢的指标公式 通达信用
  9. 华为手机怎么隐藏按键图标_华为手机如何隐藏桌面图标
  10. api 二次 开发 禅道_二次开发机制 - 禅道开源版使用帮助 - 禅道开源项目管理软件...
  11. 平安性格测试题及答案_平安人寿做性格测试怎么?
  12. Druid 技术白皮书:大数据实时统计分析数据存储
  13. 蔬菜大棚成本_在农村,建一个温室大棚要多少钱?看完一目了然!
  14. [Hadoop in China 2011] 人人网:基于Hadoop的SNS统计和聚类推荐
  15. 利用urdf及RobCoGen生成运动学及动力学代码
  16. 天梯赛--清点代码库
  17. 单词串联记忆 - 故事 - Party上浪漫的事后传
  18. java 线程耗尽_关于线程耗尽导致请求超时系统假死的思考
  19. Qt写入读取txt文本文件
  20. 不同的语言讲述“元旦快乐“

热门文章

  1. 软件测试工程师实际工作中常遇到的问题及解决方案
  2. JAVA——创建用户登录界面
  3. jQuery 版坦克大战游戏
  4. (三)初识打印机驱动
  5. opengl内存泄漏问题
  6. 如何一键将720云全景图原图下载到本地电脑里
  7. 720 全景 krpano php 去水印
  8. QQ透明名片在线上传网站源码
  9. (已解决)[h264_v4l2m2m @ 0x15bafc0] Could not find a valid device
  10. java动态代理中的invoke方法是如何被自动调用的