java多线程(同步与死锁问题,生产者与消费者问题)
首先我们来看同步与死锁问题:
所谓死锁,就是A拥有banana。B拥有apple。
A对B说:你把apple给我。我就把banana给你。
B对A说:你把banana给我,我就把apple给你。
可是A和B都在等待对方的答复,那么这样终于的结果就是A得不到apple,B也得不到banana。这样的死循环就是死锁。
于是我们能够模拟上面的描写叙述。写出下面代码:
类A代表A这个人,
public class A {
public void say(){
System.out.println("A said to B: if you give me the apple, I will give you the banana.");
}
public void get(){
System.out.println("A get the apple.");
}
}
类B代表B这个人,
public class B {
public void say(){
System.out.println("B said to A: if you give me the banana, I will give you the apple.");
}
public void get(){
System.out.println("B get the banana.");
}
}
类ThreadDeadLock代表死锁类,
public class ThreadDeadLock implements Runnable{
private static A a=new A();
private static B b=new B();
public boolean flag=false;
public void run(){
if(flag){
synchronized(a){
a.say();
try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(b){
a.get();
}
}
}else{
synchronized(b){
b.say();
try{
Thread.sleep(500);
}catch(InterruptedException e){
e.printStackTrace();
}
synchronized(a){
b.get();
}
}
}
}
}
以下是主类:
public class Main{
public static void main(String[] args){
ThreadDeadLock t1=new ThreadDeadLock();
ThreadDeadLock t2=new ThreadDeadLock();
t1.flag=true;
t2.flag=false;
Thread thA=new Thread(t1);
Thread thB=new Thread(t2);
thA.start();
thB.start();
}
}
程序执行结果:
A said to B: if you give me the apple, I will give you the banana.
B said to A: if you give me the banana, I will give you the apple.
从以上的程序执行。我们能够发现,两个线程都在等待对方的执行完毕。这样,程序也就无法继续执行,从而造成了死锁执行现象。
以下我们来看生产者与消费者问题:
所谓生产者与消费者问题,非常easy,过程就是生产者不断生产产品,消费者不断取走产品。
Producer生产product,Consumer消费product。
于是,我们先定义product类:
public class Product {
private String name="product";
private boolean flag=false;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public synchronized void set(String name){
if(!flag){
try{
super.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
this.setName(name);
try{
Thread.sleep(300);
}catch(InterruptedException e){
e.printStackTrace();
}
flag=false;
super.notify();
}
public synchronized void get(){
if(flag){
try{
super.wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
try{
Thread.sleep(300);
}catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(this.getName());
flag=true;
super.notify();
}
}
这里添加了等待与唤醒。并添加一个标志位flag,flag为true时。表示能够生产。但不能取走,此时假设线程执行到了消费者线程,则应该等待,假设flag为false,则表示能够取走。可是不能生产,假设生产者线程执行,则应该等待。
Producer类:
public class Producer implements Runnable{
private Product product=null;
public Producer(Product product){
this.product=product;
}
public void run(){
for(int i=0;i<50;++i){
this.product.set("product");
}
}
}
Consumer类:
public class Consumer implements Runnable{
private Product product=null;
public Consumer(Product product){
this.product=product;
}
public void run(){
for(int i=0;i<50;++i){
try{
Thread.sleep(100);
}catch(InterruptedException e){
e.printStackTrace();
}
this.product.get();
}
}
}
然后是主类:
public class Main{
public static void main(String[] args){
Product product=new Product();
Producer pro=new Producer(product);
Consumer con=new Consumer(product);
new Thread(pro).start();
new Thread(con).start();
}
}
于是我们知道,生产者每生产一个产品。消费者就取走一个产品,消费者每取走一个产品,就要等待生产者生产。
java多线程(同步与死锁问题,生产者与消费者问题)的更多相关文章
- java多线程(同步和死锁,生产者和消费者问题)
首先我们来看看同步与死锁: 所谓死锁.这是A有banana,B有apple. A至B说:你把apple对我来说,,我会banana给你. B至A说:你把banana对我来说,,我会apple给你. 可 ...
- Java多线程---------同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期
1.问题的引出 class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void run(){ ...
- JAVA多线程经典范列:生产者与消费者
* 第一:生产者 生产的消费品 存放到仓库中,当仓库满时,生产者停止生产 * 第二:消费者 到仓库中 使用消费品,当仓库没有消费品时,停止消费 * 第三:生产者 在仓库满停止生产后 通知消费者去消费 ...
- Java多线程-同步:synchronized 和线程通信:生产者消费者模式
大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...
- java多线程同步
一篇好文:java多线程机制同步原则 概括起来说,Java 多线程同步机制主要包含如下几点:1:如果一个类包含一个或几个同步方法,那么由此类生成的每一个对象都配备一个队列用来容纳那些等待执行同步的线程 ...
- Java多线程同步问题的探究
一.线程的先来后到——问题的提出:为什么要有多线程同步?Java多线程同步的机制是什么? http://www.blogjava.net/zhangwei217245/archive/2010/03/ ...
- 转:关于JAVA多线程同步
转:http://lanvis.blog.163.com/blog/static/26982162009798422547/ 因为需要,最近关注了一下JAVA多线程同步问题.JAVA多线程同步主要依赖 ...
- java多线程之 ---- 线程死锁
java多线程之线程死锁 产生死锁的主要原因: 由于系统资源不足. 进程执行推进的顺序不合适. 资源分配不当等. 假设系统资源充足.进程的资源请求都可以得到满足,死锁出现的可能性就非常低.否则就会因争 ...
- Java多线程——线程的死锁
Java多线程——线程的死锁 摘要:本文主要介绍了Java多线程中遇到的死锁问题. 部分内容来自以下博客: https://www.cnblogs.com/wy697495/p/9757982.htm ...
- Java多线程中的死锁
Java多线程中的死锁 死锁产生的原因 线程死锁是指由两个以上的线程互相持有对方所需要的资源,导致线程处于等待状态,无法往前执行. 当线程进入对象的synchronized代码块时,便占有了资源,直到 ...
随机推荐
- DEP受保护的问题(尤其是Outlook)
We see this issue quite regularly as we use MAPI and lots of our users run our application on TS. Of ...
- Delphi利用Webbrowser登陆QQ群文档
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- let区别(关于racket和r5rs)
R5RS is the Revised5 Report on the Algorithmic Language Scheme.参考http://www.schemers.org/Documents/S ...
- mysql 开启事务
START TRANSACTION, COMMIT, and ROLLBACK Syntax 开始事务,提交和回滚语法 那些语句提供了控制事务的使用: 1.START TRANSACTION 或者BE ...
- Ubuntu下Eclipse搭建ARM开发环境
第一步:安装JRE 和 Eclipse 详细步骤请参考:http://blog.csdn.net/ex_net/article/details/7251664 第二步:安装arm-linux-gcc ...
- 网易云课堂_C++程序设计入门(上)_第6单元:丹枫虽老犹多态–继承与多态_第6单元作业【2】- 在线编程(难度:中)
第6单元作业[2]- 在线编程(难度:中) 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统 ...
- nodejs面试
1. PM2相关 1. PM2的主要功能?*答案:在Node.js进程挂掉以后自动重启进程,并且能够方便的实现Node.js的集群模式* 2. 如何查看当前是否适合重启服务?*答案:pm2 monit ...
- 实用CSS3属性之 :target伪类实现Tab切换效果
CSS3 :target伪类用来改变页面中锚链接URL所指向的ID样式,例如你要改变描链接指向#tab的元素字体颜色为蓝色,哪么你可以这样写成#tab:target {color:blue} 浏览器支 ...
- UVA 820 Internet Bandwidth
题意: 给出双向图,求给出两点的流通总流量. 分析: 网络流中的增广路算法. 代码: #include <iostream>#include <cstring>#include ...
- HDU 1033 - Edge
题目很水 然翻译感人 顺时针或者逆时针走,输出坐标 #include <iostream> using namespace std; ]; int p; ]={,,,-,}; ]={,,- ...