互斥机制synchronized学习
2013-04-09 11:03
183 查看
/** * 互斥机制学习 * @author 蒙查查 * @date 2013-4-9 * **/ package com.test.sync; import java.util.LinkedList; import com.test.R; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.SlidingDrawer; public class MainActivity extends Activity{ Integer mutex = new Integer(-1); //互斥信号 LinkedList<String> list = new LinkedList<String>(); //模拟临界区 Button btn1, btn2; boolean keepRun = true; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.main); btn1 = (Button) findViewById(R.id.btn1); btn1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub keepRun = true; new Thread(new Productor()).start(); new Thread(new CustomerThread()).start(); } }); btn2 = (Button) findViewById(R.id.btn2); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub keepRun = false; } }); } /** * 模拟生产者 * */ class Productor implements Runnable { @Override public void run() { // TODO Auto-generated method stub while(keepRun) { Log.i("Productor==", ""); try { synchronized(mutex) { Log.i("Productor==", "i get a lock"); if(list.size() > 10) { //调用notify之后退出了synchronized块,即立刻释放了锁,wait()处将被唤醒 mutex.notify(); } else { double add = Math.random(); Log.i("Productor==", "add " + add); list.add("" + add); Thread.sleep(500); } } } catch(Exception e) { e.printStackTrace(); } } } } /** * 模拟消费者 * */ class CustomerThread implements Runnable { @Override public void run() { // TODO Auto-generated method stub while(keepRun) { Log.i("CustomerThread--",""); synchronized(mutex) { Log.i("CustomerThread--","i get a lock"); try { if(list.size() <= 0){ //当资源不足,消费者在等待,mutex.wait()让出CPU的使用权,并且释放了锁,当某处调用了mutex.notify()这里将被唤醒 mutex.wait(); } else { Log.i("CustomerThread--", ""+list.removeFirst()); } } catch(Exception e) { e.printStackTrace(); } } } } } } /** * PS: * wait()、notify()、notifyall()只能在synchronized块或方法中被调用,否则会抛异常。 * wait()不仅是让出了CPU的使用权,而且把持有的锁释放了。 * 分析上面的java代码:在调用mutex.wait()之前的若干步我们锁住了mutex;调用mutex.wait()让出CPU的使用权,并且释放了锁; * 调用mutex.notify()之前先获得mutex上的锁,调用notify之后退出了synchronized块,即立刻释放了锁;这时wait()被唤醒, * 它首先获得mutex上的锁,再执行下面的语句。 * */
相关文章推荐
- Java学习笔记79. 多线程的同步机制 -- synchronized 关键字
- Java学习 - synchronized同步机制
- Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁
- Java学习-Lock机制和Synchronized分析
- Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁
- java学习--同步机制lock和synchronized对比学习
- java学习初探十八之线程的线程同步_锁机制_synchronized
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】全面解析Linux内核的同步与互斥机制--互斥篇
- Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁
- Java 线程锁机制 -Synchronized Lock 互斥锁 读写锁
- Java锁机制学习笔记——synchronized 和 Lock
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】全面解析Linux内核的同步与互斥机制--同步篇
- 学习笔记 --- LINUX的同步互斥机制 --- 自旋锁与信号量的区别
- memcached学习(3)memcached的删除机制和发展方向
- Android IPC机制学习笔记(二)
- java 内存机制学习
- iOS学习之iOS沙盒(sandbox)机制和文件操作之NSFileManager(三)
- Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划
- 【嵌入式Linux学习七步曲之第五篇 Linux内核及驱动编程】Linux系统调用的实现机制分析
- android-多线程设计wait、notify、notifyall、synchronized的使用机制