/*** 互斥机制学习* @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;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main);btn1 = (Button) findViewById(R.id.btn1);btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubkeepRun = true;new Thread(new Productor()).start();new Thread(new CustomerThread()).start();}});btn2 = (Button) findViewById(R.id.btn2);btn2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubkeepRun = false;}});}/*** 模拟生产者* */class Productor implements Runnable {@Overridepublic void run() {// TODO Auto-generated method stubwhile(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 {@Overridepublic void run() {// TODO Auto-generated method stubwhile(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上的锁,再执行下面的语句。* */

互斥机制synchronized学习相关推荐

  1. Java 并发编程—有锁互斥机制及AQS理论

    原文作者:Java并发编程 原文地址:AQS这样学就很简单了 目录 一.有锁互斥机制 二.AQS如何实现互斥 三.结语 如果你是道格李,你要实现一套机制来保证线程互斥,你会如何实现呢?你肯定不会一上来 ...

  2. 线程同步机制synchronized中锁的判断以及锁的作用范围

    当我们使用多个线程访问同一资源(可以是同一个变量.同一个文件.同一条记录等)的时候,若多个线程只有读操作,那么不会发生线程安全问题,但是如果多个线程中对资源有读和写的操作,就容易出现线程安全问题. 要 ...

  3. 今天在群里面讨论了驱动机制的学习

    今天在群里面讨论了驱动机制的学习,收获挺大的,在此总结一下与大家分享.错误之处请批评指正. 在驱动接触过程中,是以内存字符设备驱动作为敲门砖的,学习了驱动程序的基本框架,各种设备方法,可是内存设备毕竟 ...

  4. ACL 2021 | 基于全局字符关联机制联邦学习的中文分词

    作者 | 陈桂敏 来源 | QTrade AI研究中心 QTrade AI 研究中心是一支将近 30 人的团队,主要研究方向包括:预训练模型.信息抽取.对话机器人.内容推荐等.本文介绍的是一篇收录于 ...

  5. 线程同步互斥机制--互斥锁

    目录 前言 一.互斥锁是什么? 二.互斥锁的使用 三.代码实现过程 1.初始化互斥锁 2.互斥锁上锁 3.互斥锁解锁 4.互斥锁释放 5.代码示例 四.死锁 前言 线程通信只需要操作共享的进程数据段即 ...

  6. linux 互斥机制

    linux 互斥机制 之前一直不能理解各种互斥机制的优劣,完整的看了<Linux设备驱动开发详解:基于最新的Linux4.0内核>这书第7章后,才彻底的搞懂了 linux 系统中的互斥机制 ...

  7. Java反射机制再学习

    Java反射机制的学习 Java反射机制的学习 转自:http://www.blogjava.net/zh-weir/archive/2011/03/26/347063.html 总结的很到位,记录下 ...

  8. Java反射机制的学习(3)

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

  9. 融合边界处理机制的学习型麻雀搜索算法

    文章目录 一.理论基础 1.麻雀搜索算法 2.HSSA搜索算法 2.1 Piecewise map初始化种群 2.2 自适应警戒者策略 2.3 多策略学习机制 2.3.1 排序配对学习策略 2.3.2 ...

  10. python 按需加载_基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)...

    基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 文档转换为PDF有些图片无法完全显示,请移步我的博客查看 完成 ...

最新文章

  1. Cucumber 入门一
  2. matlab最优控制实验报告_第十二篇 章 用MATLAB解最优控制问题及应用实例 最优控制课件.ppt...
  3. 用JS获取地址栏参数的方法
  4. springcloud 微服务鉴权_Java微服务框架spring cloud
  5. 面试题 08.09. 括号
  6. 华为服务器虚拟化断电,服务器断电日志查看
  7. Linux下如何查看高CPU占用率线程 专题
  8. 高质量PWM数字功放芯片
  9. PDF文件太大了,如何免费压缩变小?
  10. 动态规划——背包问题01背包
  11. HTML和web窗体的区别(转载)
  12. 2021苹果CMS安卓萝卜视频原生影视APP源码支持投屏选集倍速弹幕版(前端二开美化版)
  13. BroadCast Channel
  14. 计算机教室网络安全应急预案,校园网和计算机教室多媒体教室应急预案
  15. Beta冲刺-第一天
  16. 织梦全站自动关键词内链插件可指定关键词批量插入内链
  17. 8086如何计算物理地址
  18. [原创]Android x86开启houdini(arm兼容库) 手动安装houdini 支持arm app
  19. FPGA实验3:DAC FIFO实验
  20. 小说爬虫强制绕过ssl验证

热门文章

  1. STM32以DMA方式实现printf函数
  2. 聊聊MVX中的Model
  3. 利用计算机名称共享打印机步骤,如何连接共享打印机?共享打印机连接方法介绍...
  4. 用ps制作动态图片教程
  5. 常见十大量化投资策略
  6. 基于SiC集成技术的生物电信号采集方案
  7. 实数,有理数,无理数,自然数,整数的概念分别是什么?
  8. CSS3旋转跳跃的立方体
  9. 我们什么都没有,只有爱
  10. python 绘制RGB三维颜色空间色谱图(已实现)