Android synchronized wait notify 多线程同步 分享

转载 2012年03月30日 00:05:31

http://cwh528.blog.sohu.com/169639438.html

项目中碰到问题,涉及到主线程和子线程的通信和同步问题,测试中发现死锁情况,记录一下

 void Main(){

    ThreadB Threadb = new ThreadB();
    
Threadb .start();
    synchronized (handler) {
       try {
                Log.e("sync_ThreadManager", "hold_Handeler");    
                handler.wait();
                Log.e("sync_ThreadManager", "wait_Handeler");
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

 }

ThreadB extends Thread

{

    public void run() {
        Looper.prepare();
        bHandler = new Handler() {
            @Override

            public void handleMessage(Message msg) {
             //do something here
            }
        };
        synchronized (handler) {
            handler.notify();
        }
        Looper.loop();
    }

}

上述代码设计意图是:红色代码执行的时候,启动另外一个线程,主线程先执行到蓝色部分(wait),此时,wait函数会导致主线程处于suspend状态,并且释放所hold的同步对象锁handler。此后子线程threadb获得同步锁handler,threadb初始化完毕,调用notify方法通知调用wait的线程,然后主线程会重新请求同步锁,如果成功则继续执行wait后面的代码,这个过程确保了子线程threadb的bhandler成功初始化,以后主线程main可以通过bhandler和子线程进行通信。大多情况下程序运行正常。但是多线程情况下并不能保证这个顺序,可能出现假死。

正常情况如下:

1.Main 执行到synchronized (handler) ,抢先获得handler锁对象

2.vm切换执行threadb,执行到synchronized (handler)发现handler锁对象已被Main进程hold,此时threadb阻塞等待

3.Main继续执行hanlder.wait(),释放handler锁并等待

4.threadb获得handler锁,初始化bhandler,执行hanlder.notify()

5.Main得到通知,重新请求handler锁,但是此时threadb尚未出同步代码区,没有释放handler锁,Main继续等待,threadb继续执行,释放hanlder

6.Main请求hanlder锁成功,继续执行wait后面的操作

threadb先执行:

1.Main执行 Threadb.start() 

2.VM切换执行threadb,获得handler锁。

3.VM切换执行Main,发现hanlder锁被threadb hold,阻塞等待

4.VM切换threadb,继续执行notify,直到出同步代码区,释放hanlder锁

5.VM切换执行Main,获得hanlder锁,执行到wait,阻塞等待别的线程notify

6.这个例子中,notify只执行了一次,所以main,再也等不到别的线程叫它吃饭了(notify),只好饿死

主要问题是notify 不能通知到后到来wait线程,所以解决方法就是确保main线程先进入synchronized,可在threadb 执行synchronized之前判断main是否已经进入synchronized



相关文章推荐

Android synchronized wait notify 多线程同步

项目中碰到问题,记录一下 ThreadB Thread = new ThreadB();  syncThread.start();   synchronized (handler) {    ...

Android synchronized wait notify 多线程同步 .

项目中碰到问题,涉及到主线程和子线程的通信和同步问题,测试中发现死锁情况,记录一下  void Main(){     ThreadB Threadb = new ThreadB();     ...

多线程同步 synchronized 以及wait notify notigyAll的总结

(多线程同时访问同一块资源的话,会导致结果错误。所以有了同步这个概念。同步,顾名思义就是,多个线程其他地方和一起做一件事,但在synchronized标记的地方必须排队,一个一个来执行,为了实现这样的...

多线程同步-线程之间通信:wait notify 另外还有interrupt,join方法

线程之间的相互作用:线程之间通信 (生产者-消费者问题:可以看成两个线程,生产者一个线程,消费者一个线程,生产者这生产一个东西告诉消费者可以消费了,消费者消费完这个东西就通知生产者可以生产了,绝对...

java多线程同步(wait、notify)生产者消费者简单示例

一、为何写最为一个Android开发者,如果做得不够深入可能为不会去处理多线程同步的问题,稍微简单点可能使用一个线程池就可以搞定了,有关线程池的介绍可以参考我的另一篇文章:ExecutorServic...

多线程并发编程(四):多线程同步互斥Wait/Notify

前言 前面说了使用Synchronized来进行线程之间的同步,接下来说明wait/notify的使用。 首先wait/notify必须结合synchronized来使用,即在synch...

[java多线程]多线程同步(二)——wait, notify, notifyAll, join以及sleep

1

Android进阶——多线程系列之wait、notify、sleep、join、yield、synchronized关键字、ReentrantLock锁

多线程系列之线程的wait、Sleep、join、yield、synchronized关键字、ReentrantLock锁

Android 价值千万java多线程同步 <四> synchronized&Lock&Atomic6种方式

一、synchronized    由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。 当两个并发线程访问同一...

Android/JAVA 笔记 同步操作/synchronized / wait()/ notify()

synchronized编写程序离不开多线程操作。而多线程又离不开同步操作。这是很重要的。java语言有一个关键词synchronized可以应多同步操作。之前学习的时候我没有怎么去理解这个东西。最近...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)