public class ThreadDemo5 {
public static void main(String[] args){
Pool pool = new Pool();
Productors p1 = new Productors(pool);
Consumers c1 = new Consumers(pool);
Consumers c2 = new Consumers(pool);
p1.start();
c1.start();
c2.start();
}
} class Pool{
private static int MAX = 1;
private java.util.List<Integer> list = new java.util.LinkedList<Integer>(); public void addList(int i){
synchronized(this){ // 如果 这里以 list 为锁,那么后面的wait notify,notifyAll 都要用 list.wait list.notify list.notifyAll
while (list.size()>=MAX){
try{
this.wait(3);//等待 3 毫秒,然后开始抢所得控制权//防止死锁的方式 一
}
catch (Exception e){ }
}
list.add(new Integer(i));
System.out.println("aft add--->>> "+list.size());
// this.notify(); //如果 采用的是notify,且 wait没有指定参数,那么会形成死锁
this.notifyAll(); //将线程等待序列中的所有等待线程都唤醒,notify 是随机唤醒一个。//防止死锁的方式二
}
} public int remove(){
synchronized(this){
while (list.size()<=0){
try{
wait(3);//这里默认就是用的this.wait
}
catch(Exception e){ }
}
int n = list.remove(0); System.out.println("aft remove______--->>> "+list.size());
notifyAll();
return n;
}
} } class Productors extends Thread{
private String name;
private Pool pool;
static int i = 1; public Productors(Pool pool){
this.pool = pool;
}
public void run(){
while(true){
pool.addList(i);
// System.out.println("p.add--->>> "+);
i ++; }
}
}
class Consumers extends Thread{
private Pool pool;
private String name;
public Consumers(Pool pool){
this.pool = pool;
}
public void run(){
while(true){
int result = pool.remove();
// System.out.println("c.remove --->>> "+result);
}
}
}

多线程 死锁 wait(int i) notifyAll()的更多相关文章

  1. Java多线程中wait, notify and notifyAll的使用

    本文为翻译文章,原文地址:http://www.journaldev.com/1037/java-thread-wait-notify-and-notifyall-example 在Java的Obje ...

  2. 使用jstack排查多线程死锁、阻塞

    问题: 针对线上多线程死锁.阻塞,跑着跑着就卡住了 查看线上线程池的状态 jstack用于生成java虚拟机当前时刻的线程快照. 线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成 ...

  3. java多线程的wait、notify/notifyAll区别

    1.wait().notify/notifyAll() 方法是Object的本地final方法,无法被重写.   2.wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized ...

  4. Java 多线程 死锁 隐性死锁 数据竞争 恶性数据竞争 错误解决深入分析 全方向举例

    在几乎所有编程语言中,由于多线程引发的错误都有着难以再现的特点,程序的死锁或其它多线程错误可能只在某些特殊的情形下才出现,或在不同的VM上运行同一个程序时错误表现不同.因此,在编写多线程程序时,事先认 ...

  5. Java 多线程 --死锁及解决方案

    在java 多线程中 过多的同步造成相互不释放资源 从而相互等待,造成死锁线现象,一般发生于同步中持有多个对象锁 如以下代码: public class DeadLock { public stati ...

  6. Java多线程死锁的产生实例

    死锁产生的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用.(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放.(3) 不剥夺条件:进程已获得的资源,在末使用完 ...

  7. web开发中的多线程死锁问题,避免死锁

    1.什么是死锁,产生死锁的原因,和产生死锁的必要条件 所谓死锁(DeadLock),是指多个进程或线程在运行过程中因争夺资源而造成的一种僵局,当进程或线程处于僵局时,若无外力作用,它们将无法再向前推进 ...

  8. gdb调试分析多线程死锁

    转载: http://blog.chinaunix.net/uid-30343738-id-5757210.html #include <stdio.h> #include <pth ...

  9. Java多线程——死锁

    当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么他永远被阻塞,当线程A持有锁L并想获得锁M的同时,线程B持有锁M并同时尝试获得锁L时,那么两个线程将永远的等待下去,这中情况就是简单的死 ...

随机推荐

  1. Apache poi简介及代码操作Excel

    一.简介 在我们进行企业的系统开发时,难免会遇到网页表格和Excel之间的操作问题(POI是个不错的选择) Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序 ...

  2. Java - 26 Java 数据结构

    Java 数据结构 Java工具包提供了强大的数据结构.在Java中的数据结构主要包括以下几种接口和类: 枚举(Enumeration) 位集合(BitSet) 向量(Vector) 栈(Stack) ...

  3. LOJ6268拆分数

    /* 相当于每种物品都有无限个的背包 毕竟考场上写exp是个比较危险的行为 对数据进行根号分治是个比较好的方法 对于小于等于根号的部分暴力背包转移 对于大于根号的 最多只会拿根号个 dp一下就好了 * ...

  4. vscode 正则 计算代码全部有效行数;清除文件空行

    清除空行: 正则表达式:^\s*(?=\r?$)\n 计算全部代码行数: 正则表达式:b*[^:b#/]+.*

  5. 2012年第三届蓝桥杯Java本科组省赛试题解析

    题目地址:https://wenku.baidu.com/view/326f7b4be518964bcf847c96.html?rec_flag=default    => 百度文档 题目及解析 ...

  6. webkitAnimationEnd动画事件

    春节终于过完了,自己春节似乎过的有点大,过完春节之后,态度一直没有调整好,总有一股过节的情绪,没有完全进入学习和工作的状态来.继续调整当中…… 这两天项目中遇到一个小需求,十分类似于支付宝蚂蚁森林给小 ...

  7. 第一次调用从server获取Cookie

    System.setProperty("javax.net.ssl.trustStore", certPath); public String getCookieString(St ...

  8. LeetCode 7 Reverse Integer & int

    Reverse Integer 想用余10直接算,没想到 -123%10 是 7, 原因 -123-(-123//10*10) r=a-n*[a/n] 以上,r是余数,a是被除数,n是除数. 唯一不同 ...

  9. ant 标签详解

    Ant 开发 Ant的构建文件当开始一个新的项目时,首先应该编写Ant构建文件.构建文件定义了构建过程,并被团队开发中每个人使用.Ant构建文件默认命名为build.xml,也可以取其他的名字.只不过 ...

  10. 1.maven中pom.xml文件中<exclusions>标签认不到问题

    问题描述: