标签:dex 生产者 main ota new 方式 tar test 进程同步
学校实验存档//。。
以经典的生产者消费者问题作为载体。
进程同步方式接口:
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 指令模拟 + 记录型信号量模拟
标签:dex 生产者 main ota new 方式 tar test 进程同步
原文地址:http://www.cnblogs.com/xkxf/p/7866956.html