学校实验存档//。。

以经典的生产者消费者问题作为背景。

进程同步方式接口:

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 指令模拟 + 记录型信号量模拟的更多相关文章

  1. Java硬件同步机制Swap指令模拟+记录型信号量模拟

    学校实验存档//.. 以经典的生产者消费者问题作为背景. 进程同步方式接口: package method; /** * P表示通过,V表示释放 */ public interface Method ...

  2. 【总结】Java线程同步机制深刻阐述

    原文:http://hxraid.iteye.com/blog/667437 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread ...

  3. java多线程同步机制

    一.关键字: thread(线程).thread-safe(线程安全).intercurrent(并发的) synchronized(同步的).asynchronized(异步的). volatile ...

  4. 浅谈Java多线程同步机制之同步块(方法)——synchronized

    在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享.下面代码示意三个窗口购5张火车票: package com.jikexueyuan.t ...

  5. Java多线程同步机制之同步块(方法)——synchronized

    在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享.下面代码示意三个窗口购5张火车票: package com.jikexueyuan.t ...

  6. Java CAS同步机制 实践应用

    利用CAS实现原子操作类AtomicInteger (这是自定义的AtomicInteger:java有封装好的原子操作AtomicInteger类): class AtomicInteger { p ...

  7. Java CAS同步机制 原理详解(为什么并发环境下的COUNT自增操作不安全): Atomic原子类底层用的不是传统意义的锁机制,而是无锁化的CAS机制,通过CAS机制保证多线程修改一个数值的安全性。

    精彩理解:  https://www.jianshu.com/p/21be831e851e ;  https://blog.csdn.net/heyutao007/article/details/19 ...

  8. Java多线程同步机制(synchronized)

    参看:http://enetor.iteye.com/blog/986623

  9. FreeRTOS 任务通知模拟计数型信号量

    举例 //释放计数型信号量任务函数 void SemapGive_task(void *pvParameters) { u8 key; while(1) { key = KEY_Scan(0); // ...

随机推荐

  1. c#使用PortableDeviceApiLib读取便携式设备(WPD:Windows Portable Devices)信息

    相关名词解释: WPD( Windows Portable Devices) 译作Windows 便携设备 (WPD) 是一种驱动程序技术,可支持广泛的可移动设备,比如移动电话.数码相机和便携媒体播放 ...

  2. SQL---存储过程---存储过程编写案例

    存储过程的创建和调用演示 1.不带参数的存储过程的创建 create procedure PRO_With_No_Param as Begin --begin可省略 select * from sc ...

  3. E:I Think I Need a Houseboat-poj

    E:I Think I Need a Houseboat 总时间限制:  1000ms 内存限制:  65536kB 描述 Fred Mapper is considering purchasing ...

  4. [flask/python/web] 解析flask web开发(Miguel著)一书第11章主页不显示博文表单的问题

    ---------------------------------------------以下内容2017.7.14更新---------------------------------------- ...

  5. python 抓取金融数据,pandas进行数据分析并可视化系列 (一)

    终于盼来了不是前言部分的前言,相当于杂谈,算得上闲扯,我觉得很多东西都是在闲扯中感悟的,比如需求这东西,一个人只有跟自己沟通好了,总结出某些东西了,才能更好的和别人去聊,去说. 今天这篇写的是明白需求 ...

  6. video字幕无法显示,video视频在google中无法控制快进

    video字幕(track)无法显示: 直接用关闭同源策略的浏览器打开你的HTML文件可以请求到字幕文件并显示字幕: 从hbuilder中打开html文件,在从里面打开google浏览器去浏览HTML ...

  7. [设计模式]PHP设计模式之单例模式

    面试最常见的问题之一就是  请问您知道哪些设计模式这次先介绍最经典的单例模式.单例模式分3种:懒汉式单例.饿汉式单例.登记式单例.单例模式有以下3个特点:1.只能有一个实例.2.必须自行创建这个实例. ...

  8. 【转】Python微信好友头像拼接图

    转自:Python微信好友头像拼接图 今天在朋友圈看到有人发了微信好友拼接图,心里满是新奇,看了下评论才知道用Python写的.心里痒痒,立马就安装了下Python. 安装好了之后,看了下大神的代码, ...

  9. PF_RING install in centos7

    很多centos7是最小化安装. 这样很多kernel就没有安装全,而且很多开发库也没有. 在安装PF_RING过程中,会缺少很多依赖. 首先安装依赖包: yum -y install numactl ...

  10. MATLAB中最基本函数plot()的用法

    1二维平面图形 1.1基本图形函数 画出一条正弦曲线和一条余弦曲线 1.1.1绘图参数表 y 黄- 实线. 点< 小于号 m 紫: 点线o 圆s 正方形 c 青-. 点划线x 叉号d 菱形 r  ...