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释放了锁。