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

来源:互联网 发布:美图软件 编辑:程序博客网 时间:2024/06/15 13:09

    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释放了锁。
原创粉丝点击