java 线程同步中LOCK释放问题

CSDN上的一个例子【注意其中lock.notify();的3个位置】:publicclassPrintNum{privatebyte[]lock=newbyte[0];... CSDN上的一个例子【注意其中 lock.notify();的3个位置】:
public class PrintNum {
private byte[] lock = new byte[0];

public void demo() {
PrintThread a = new PrintThread("a");
PrintThread b = new PrintThread("b");
a.start();
b.start();
}

class PrintThread extends Thread {
public PrintThread(String name) {
this.setName(name);
}

@Override
public void run() {
synchronized (lock) {

for (int i = 0; i < 100; i++) {
lock.notify();//位置1,程序可正常执行结束
if (i % 10 == 0 && 0 != i) {
try {

//位置2,程序执行到a:99,b:99后无法正常结束
lock.wait();
//位置3,程序执行到a:9,b:9后无法继续执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(this.getName() + ": " + i);
}
}
}
}

public static void main(String[] args) {
PrintNum printNum = new PrintNum();
printNum.demo();
}
}
展开
 我来答
鸿渺shadow
2013-07-29 · TA获得超过196个赞
知道小有建树答主
回答量:108
采纳率:100%
帮助的人:79.8万
展开全部

问问题要把自己疑惑的地方明确的说出来,不然谁知道你想问什么。

lock.notify();作用是唤醒等待的线程。

lock.wait();作用是使当前线程进入等待,一直到该lock被notify

你执行以下下面的代码就明白了。

public class PrintNum {
    private byte[] lock = new byte[0];
    PrintThread a = new PrintThread("a");
    PrintThread b = new PrintThread("b");
   
    public void demo() {
        a.start();
        b.start();
    }
    
    public void printState(){
     System.out.println("a state:"+a.getState());
     System.out.println("b state:"+b.getState());
    }

    class PrintThread extends Thread {
        public PrintThread(String name) {
            this.setName(name);
        }

        @Override
        public void run() {
            synchronized (lock) {
                for (int i = 0; i < 100; i++) {
                    printState();//控制台输出线程状态
                    lock.notify();//位置1,程序可正常执行结束
                    if (i % 10 == 0 && 0 != i) {
                        try {
                         //lock.notify();
                             //位置2,程序执行到a:99,b:99后无法正常结束
                            lock.wait();
                            //位置3,程序执行到a:9,b:9后无法继续执行
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println(this.getName() + ": " + i);
                }
            }
        }
    }

    public static void main(String[] args) {
        PrintNum printNum = new PrintNum();
        printNum.demo();
    }
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户48084
2013-07-19 · 贡献了超过318个回答
知道答主
回答量:318
采纳率:0%
帮助的人:79.9万
展开全部
你想知道什么?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
手机用户55949
2013-07-19 · 贡献了超过197个回答
知道答主
回答量:197
采纳率:0%
帮助的人:60.4万
展开全部
你想知道什么?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ZS_saywelfare
2013-07-19 · TA获得超过154个赞
知道答主
回答量:128
采纳率:0%
帮助的人:70.7万
展开全部
你想知道什么?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式