Java 硬件同步机制 Swap 指令模拟 + 记录型信号量模拟
学校实验存档//。。
以经典的生产者消费者问题作为背景。
进程同步方式接口:
package method; /**
* P表示通过,V表示释放
*/
public interface Method {
void p();
void v();
}
模拟 Swap 指令实现该接口:
package method; public class Swap implements Method {
private boolean lock = false;
/**
* 创建一个特殊的instance变量(它得是一个对象)来充当锁
*/
private byte[] objectLock = new byte[0]; public void p() {
boolean key = true;
boolean temp;
do {
synchronized(objectLock) {
temp = key;
key = lock;
lock = temp;
}
} while (key != false);
} public void v(){
synchronized (objectLock) {
this.lock = false;
}
}
}
生产者 & 消费者:
package entity.producerconsumer; import method.Method; /**
* 生产者实体类
*/
public class Producer implements Runnable {
/**
* 统计生产者数量
*/
private static int total = 0;
/**
* 生产者个体的 id
*/
private int id;
/**
* 模拟缓冲区
*/
private Buffer buffer;
/**
* 允许动态更改同步机制
*/
private Method method; /**
* 传入缓冲区地址,同步机制
* @param buffer
* @param method
*/
public Producer(Buffer buffer, Method method) {
this.id = ++total;
this.buffer = buffer;
this.method = method;
} /**
* 打印生产者信息
* @return
*/
@Override
public String toString() {
return id + " 号生产者";
} @Override
public void run() {
while (true) {
method.p();
// 临界区代码
if (buffer.notFull()) {
// 生产产品
buffer.putItem();
System.out.println(this + ": " + buffer);
} method.v();
}
}
}
/
package entity.producerconsumer; import method.Method; /**
* 消费者实体类
*/
public class Consumer implements Runnable {
/**
* 统计消费者数量
*/
private static int total = 0;
/**
* 消费者个体的 id
*/
private int id;
/**
* 模拟缓冲区
*/
private Buffer buffer;
/**
* 允许动态更改同步机制
*/
private Method method; /**
* 传入缓冲区地址,同步机制
* @param buffer
* @param method
*/
public Consumer(Buffer buffer, Method method) {
this.id = ++total;
this.buffer = buffer;
this.method = method;
} /**
* 打印消费者信息
* @return
*/
@Override
public String toString() {
return id + " 号消费者";
} @Override
public void run() {
while (true) {
method.p();
// 临界区代码
if (buffer.notEmpty()) {
// 消费产品
buffer.getItem();
System.out.println(this + ": " + buffer);
} method.v();
}
}
}
/
package entity.producerconsumer; /**
* 缓冲区实体,用于模拟缓冲区
*/
public class Buffer {
/**
* 当前产品数量
*/
private int count = 0;
/**
* 最大允许数量
*/
private int max; public Buffer(int max) {
this.max = max;
} /**
* 判断缓冲区是否为满
* @return
*/
public boolean notFull() {
return (count < max);
} /**
* 判断缓冲区是否为空
* @return
*/
public boolean notEmpty() {
return (count > 0);
} /**
* 生产产品
*/
public void putItem() {
count++;
} /**
* 消费产品
*/
public void getItem() {
count--;
} /**
* 打印缓冲区信息
* @return
*/
@Override
public String toString() {
return "缓冲区内有 " + count + " 件产品";
}
}
用于测试 Swap 指令的主函数:
package test; import entity.producerconsumer.Buffer;
import entity.producerconsumer.Consumer;
import entity.producerconsumer.Producer;
import method.Method;
import method.Swap; public class Main {
public static void main(String[] args) {
// 缓冲区大小为 10
Buffer buffer = new Buffer(10);
// 允许动态更改同步机制
Method SynchronizationMechanism = new Swap();
// 创建 5 个生产者和 5 个消费者
for (int i = 0; i != 5; ++i) {
new Thread(new Producer(buffer, SynchronizationMechanism)).start();
new Thread(new Consumer(buffer, SynchronizationMechanism)).start();
}
}
}
用记录型信号量重新实现接口(此段代码来自课件):
package method; /*
该类用于模拟信号量及其P,V操作
使用方法如下: method.Semaphore mutex = new method.Semaphore(1); //信号量的初值赋为1
mutex.p();
//临界区代码
mutex.v();
*/ public class Semaphore implements Method {
private int semValue;
public Semaphore(int semValue) {
this.semValue = semValue;
}
public synchronized void p() {
semValue--;
if (semValue < 0) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public synchronized void v(){
semValue++;
if (semValue <= 0) {
this.notify();
}
}
}
Java 硬件同步机制 Swap 指令模拟 + 记录型信号量模拟的更多相关文章
- Java硬件同步机制Swap指令模拟+记录型信号量模拟
学校实验存档//.. 以经典的生产者消费者问题作为背景. 进程同步方式接口: package method; /** * P表示通过,V表示释放 */ public interface Method ...
- 【总结】Java线程同步机制深刻阐述
原文:http://hxraid.iteye.com/blog/667437 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread ...
- java多线程同步机制
一.关键字: thread(线程).thread-safe(线程安全).intercurrent(并发的) synchronized(同步的).asynchronized(异步的). volatile ...
- 浅谈Java多线程同步机制之同步块(方法)——synchronized
在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享.下面代码示意三个窗口购5张火车票: package com.jikexueyuan.t ...
- Java多线程同步机制之同步块(方法)——synchronized
在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享.下面代码示意三个窗口购5张火车票: package com.jikexueyuan.t ...
- Java CAS同步机制 实践应用
利用CAS实现原子操作类AtomicInteger (这是自定义的AtomicInteger:java有封装好的原子操作AtomicInteger类): class AtomicInteger { p ...
- Java CAS同步机制 原理详解(为什么并发环境下的COUNT自增操作不安全): Atomic原子类底层用的不是传统意义的锁机制,而是无锁化的CAS机制,通过CAS机制保证多线程修改一个数值的安全性。
精彩理解: https://www.jianshu.com/p/21be831e851e ; https://blog.csdn.net/heyutao007/article/details/19 ...
- Java多线程同步机制(synchronized)
参看:http://enetor.iteye.com/blog/986623
- FreeRTOS 任务通知模拟计数型信号量
举例 //释放计数型信号量任务函数 void SemapGive_task(void *pvParameters) { u8 key; while(1) { key = KEY_Scan(0); // ...
随机推荐
- HTML5开发必备的工具
现在除了移动APP开发之外,比较火的就是html5开发了,现阶段的HTML5被看做是Web开发者创建流行web应用的利器,增加了对视频和Canvas2D的支持,它的优点就是可以跨平台使用,比如你是开发 ...
- 十、Hadoop学习笔记————Hive与Hbase以及RDBMS(关系型数据库)的关系
Hive目的是为了简化MapReduce编程 实际应用中,Hive与Hbase不经常链接
- 关于苹果APP的上架整理
由于苹果的机制,在非越狱机器上安装应用必须通过官方的App Store,开发者开发好应用后上传App Store,也需要通过审核等环节.AppCan作为一个跨主流平台的一个开发平台,也对ipa包上传A ...
- QuickTime视频解析问题
在QuickTime中可以解析出视频并播放视频,解析的格式后缀名为.mov,之后将该视频导入到Unity Project中,显示未解析到视频文件,本来应该会自动生成MovieTexture材质,但是并 ...
- nomad的简易集群
启动服务器 第一步是为服务器创建配置文件.无论是从下载的文件github,或粘贴到一个名为server.hcl: vim server.hcl # Increase log verbosity log ...
- ASP.NET Core中的OWASP Top 10 十大风险-跨站点脚本攻击 (XSS)
不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...
- UWP 共享文件——发送者
这一节,顾名思义,即使你要共享数据给别人,你是数据的提供者.分两步即可1.直接复制代码 protected override void OnNavigatedTo(NavigationEventArg ...
- Chrome浏览器调试技巧
本文主要讲解针对chrome浏览器的调试方案,对于其他浏览器其实大同小异. 先来入门一点的 DOM元素调试 看上图: 以上图表明的1,2,3,4,5标记说明: 1,为移动设备模拟器,chorme现在是 ...
- android应用集成google登录
集成google登录之前需要有一下三点要求,只有具备一下两点要求才能集成google登录: 1,android 运行版本4.0及更新版本 2,android 设 ...
- Ambari源代码分析之Resource.Type与ResourceProvider相应关系
前面提到.每一种Resource都相应一个ResourceProvider,以下给出其相应关系: Resource.Type ResourceProvider Workflow WorkflowRes ...