1.
wait():释放资源,释放锁
sleep():释放资源,不释放锁
wait():Object的方法,用在同步当中,是同步锁的方法,以锁控制线程
sleep():线程类Thread本身的静态方法
wait():释放资源,释放锁
sleep():释放资源,不释放锁
wait():Object的方法,用在同步当中,是同步锁的方法,以锁控制线程
sleep():线程类Thread本身的静态方法
wait(),notify(),notifyAll()方法是用在同步当中的:必须是同步当中的同一把锁操作线程。所以这几个方法是Object的方法。试想想不在同步中的多线程,由于抢夺执行权结果不定,控制无意义,线程间也无法通信:怎样知道当前是哪个线程呢?怎样捕获这个线程操作它呢?
同步的窍门:如果加了同步还有线程安全问题,想两个前提:1,是不是两个或两个以上线程 2.用的是不是同一把锁
只同步了一个线程的代码是不行的,要将所有线程运行的代码都用同一把锁同步,这样一个执行同步代码,其他的判断同一把锁,才无法进入自己执行的代码
即使在一个Runnable的操作代码中是一句, 要同步的也不是一句:是几个要同步的线程要操作的所有代码
例子:
class Person
{
String name;
String gender;
boolean flag=false;//标记,默认不输出
}
class Input implements Runnable
{
private Person p;
private int n=0;
public Input(Person p){
this.p=p;
}
public void run(){
//别忘了while(true)!!
while(true){
synchronized(p){//两个Runnable用同一个Person初始化,就可保证p是同一个且唯一
if(p.flag){
try{p.wait();}catch(InterruptedException e){}
}
//not "else"
if(n==0){
p.name="Jason";
p.gender="男";
}else{
p.name="Lily";
p.gender="女";
}
n=(n+1)%2;
p.flag=true;//修改标志位
p.notify();//唤醒另一个
}
}
}
}
class Output implements Runnable
{
private Person p;
public Outpu