学校实验存档//。。

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

进程同步方式接口:

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. 我使用过的Linux命令之sftp - 安全文件传输命令行工具

    用途说明 sftp命令可以通过ssh来上传和下载文件,是常用的文件传输工具,它的使用方式与ftp类似,但它使用ssh作为底层传输协议,所以安全性比ftp要好得多. 常用方式 格式:sftp <h ...

  2. 【BZOJ2905】背单词 fail树+DFS序+线段树

    [BZOJ2905]背单词 Description 给定一张包含N个单词的表,每个单词有个价值W.要求从中选出一个子序列使得其中的每个单词是后一个单词的子串,最大化子序列中W的和. Input 第一行 ...

  3. [Android Tips] 17. 查看 APK 签名信息

    从 APK 文件中获取签名信息 方法一 $ keytool -list -printcert -jarfile <path of APK> 方法二 解压 APK 文件,释放出 META-I ...

  4. 2017 Multi-University Training Contest - Team 2——HDU6050 Funny Function

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6050 题意:题目很短自己看吧, 就是这个递推式子,说的很清楚了,让你求F(m,1).题解里面分什么奇偶 ...

  5. Network Security Services If you want to add support for SSL, S/MIME, or other Internet security standards to your application, you can use Network Security Services (NSS) to implement all your securi

    Network Security Services | MDN https://developer.mozilla.org/zh-CN/docs/NSS 网络安全服务 (NSS) 是一组旨在支持支持安 ...

  6. 【python】-- RabbitMQ 队列消息持久化、消息公平分发

    RabbitMQ 队列消息持久化 假如消息队列test里面还有消息等待消费者(consumers)去接收,但是这个时候服务器端宕机了,这个时候消息是否还在? 1.队列消息非持久化 服务端(produc ...

  7. FreeMarker 的使用方法

    1.FreeMarker 概述 FreeMarker 是一个用Java语言编写的模板引擎,使用模板来生成文本输出;主要用于做静态页面或页面展示; 2.FreeMarker 使用 // 导入jar包: ...

  8. linux统计当前文件夹下所有文件的个数

    ls 加 R 选项表示recursive递归

  9. paintschainer项目

    github:https://github.com/pfnet/PaintsChainer tensorflow实现:https://github.com/mizti/tensor_paint 在线测 ...

  10. MySQL与Btree

    Btree,B+tree,B*tree 前言: 由于在查找中用二分法在查找一些边缘数据时就会产生数据查找不公平,二叉树也存在类似问题:所以就有了B-tree. B+树索引是B+树在数据库中的一种实现, ...