死锁机制以及生产者与消费者模式

    java之所以能够一直矗立在各种编程语言之前,与它的多线程技术是密不可分的!

  1.我们在使用多线程技术时,除了要保证他的效率,更要确保安全性,java的多线程技术为了确保其安全引入了锁(synchronized)的概念,给程序的安全带来了极大的保证

 2.synchronized(锁)我简单的分为代码块锁和方法锁

   

这两个锁执行的内容是一样的,但是他们的锁对象不一样,代码块的锁对象是静态的obj对象,而方法体的锁对象则

执行该方法的对象

这两个锁执行的内容是一样的,他们的锁对象也是一样的,都是执行该方法的对象

3.死锁的由来,我们都知道线程的运行机制,处于就绪的线程争夺cpu的资源,当多个线程拥有同一个锁的时候,当一个线程没有释放锁时,其它线程无法得到锁去执行,而这个时候就会出现问题了

4.死锁的根本,简单的来分析,以两个同时进行的线程来解析,每个线程所执行的代码块都含有两个锁,一个锁里面

包含另一个锁,两个锁进行嵌套       

 

 

解析:这里通过主线程的进栈,随后产生了两个线程,这两个线程开始争夺cpu的执行权,但由于两个线程外面的锁对象不是同一个,可能第一个线程执行时(没有执行完),第二个线程也得到了cpu执行权,然后两个线程都得不到对方的锁,只能进行僵持,造成最后的死锁。

生产者与消费者模式

package cn.itcast.newConnectThread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class Resource {
  private String name ;
  private int num;
  private boolean flag;
  private Lock lock = new ReentrantLock();
  private Condition set = lock.newCondition();
  private Condition out = lock.newCondition();
  public void set(String name){
try{ 
 lock.lock();
 while(flag){
 try {
set.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 }
 this.name = name;
 num++;
 System.out.println(Thread.currentThread().getName()+"生产...."+name+"第"+num+"只");
 flag = true;
 out.signal();
}
finally{
lock.unlock();
}
  }
  public void out(){
try{ 
 lock.lock();
 while(!flag){
 try {
out.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
 }
 System.out.println(Thread.currentThread().getName()+"消费"+name+"第"+num+"只");
 flag = false;
 set.signal();
}
finally{
lock.unlock();
}
  }
}

这里我们利用了锁的新机制,lock对象,同时有两个不同的监视对象。更加容易的去区分两个不同的模式(生产者和消费者),以免去造成死锁。

这里我们不得不提一下wait和sleep方法了,他们俩个方法都是释放cpu资源,但是不同的是sleep没有释放锁,而wait释放了锁。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值