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) {    ...
  • kufeiyun
  • kufeiyun
  • 2011年02月26日 18:14
  • 10392

Android synchronized wait notify 多线程同步 .

项目中碰到问题,涉及到主线程和子线程的通信和同步问题,测试中发现死锁情况,记录一下  void Main(){     ThreadB Threadb = new ThreadB();     ...
  • yeqishi
  • yeqishi
  • 2011年12月15日 18:45
  • 786

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

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

多线程同步中的wait,notify,notifyAll方法的深入学习

在多线程的运用中,难免希望mou'ge

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

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

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

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

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

1
  • cq1982
  • cq1982
  • 2014年10月09日 17:30
  • 966

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

前言 前面说了使用Synchronized来进行线程之间的同步,接下来说明wait/notify的使用。 首先wait/notify必须结合synchronized来使用,即在synch...
  • saytime
  • saytime
  • 2016年04月19日 17:16
  • 818

Java多线程同步中同步代码块、wait、notify与notifyAll的真正含义与工作原理

今天在和导师讨论Java多线程编程的同步问题时,发现对同步代码块、wait()方法、notify()方法和notifyAll()方法的理解不太清晰,于是在网上查阅资料,可是结果众说纷纭,于是结合编程验...
  • LPWSTR
  • LPWSTR
  • 2017年11月15日 20:57
  • 33

Java多线程--同步与死锁:synchronized;等待与唤醒:wait、notify、notifyAll;生命周期

1、问题的引出 class MyThread implements Runnable{ private int ticket = 5 ; // 假设一共有5张票 public void ru...
  • waldmer
  • waldmer
  • 2013年10月12日 09:34
  • 7395
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android synchronized wait notify 多线程同步 分享
举报原因:
原因补充:

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