`

互斥访问,限制最大数访问

 
阅读更多
/**
 * @author jgao1 
 * 用法:PortfolioManager portfolioManager = PortfolioManager.getInstance();
 *       portfolioManager.calculateMvoByXMLString(configXml,inputXml,timOut);
 */
public class PortfolioManager {

	private static PortfolioManager instance; // 唯一实例
	private static int MaxClients = 30;// 最大连接数
	private static int clients; // 连接的客户端

	/**
	 * 单例模式建构私有函数以防止其它对象创建本类实例
	 */
	private PortfolioManager() {

	}

	/**
	 * 采用单例模式,返回唯一实例.如果是第一次调用此方法,则创建实例
	 * 
	 * @return 唯一实例
	 */
	public static synchronized PortfolioManager getInstance() {
		if (instance == null) {
			instance = new PortfolioManager();
		}
		return instance;
	}

	/**
	 * 计算MVO
	 * 
	 * @param configXml
	 * @param inputXml
	 * @param timOut:毫秒
	 * @return
	 */
	public synchronized String calculateMvoByXMLString(String configXml,
			String inputXml, long timOut) {
		String outPutXml = null;
		clients++;
		if (clients <= MaxClients) {
			try {
				outPutXml = PortfolioUtils.calculateMvoByXMLString(configXml,
						inputXml);
				freeClient();
			} catch (Exception e) {
				freeClient();
			}
		} else {
			long startTime = System.currentTimeMillis();
			while (!(clients <= MaxClients)) {
				try {
					wait(timOut);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				if ((System.currentTimeMillis() - startTime) >= timOut) {
					// 记录log日志
					return null;// 超时返回为空
				}
			}
			try {
				outPutXml = PortfolioUtils.calculateMvoByXMLString(configXml,
						inputXml);
				freeClient();
			} catch (Exception e) {
				freeClient();
			}
		}
		return outPutXml;
	}

	/**
	 * 同步減少客户端的连接
	 */
	public synchronized void freeClient() {
		clients--;
		notifyAll();// 唤醒其他等待的线程
	}
}

 

分享到:
评论

相关推荐

    linux之线程同步一.doc

    信号量通常用于计数,它可以用来限制对共享资源的访问次数。当一个线程试图访问资源时,如果资源已经被其他线程占用,信号量就会减少相应的计数,表示还有请求等待。当线程完成对资源的访问后,它应该增加信号量的...

    深入了解c# 信号量和互斥体

    Semaphore类限制可同时访问某一资源或资源池的线程数。WaitOne method, which is inherited from the WaitHandle class, and release the semaphore by calling the Release method.”&gt;线程通过调

    操作系统之读者写者问题

    所谓的”读者—写者问题”是指保证一个Writer进程必须与其他进程互斥地访问共享对象地同步问题.其读写操作限制(包括读者优先和写者优先): 1)写--写互斥,即不能有两个写者同时进行写操作; 2)读--写互斥,即不能...

    基于C语言实现操作系统进程管理【100010847】

    写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写...

    在同步代码结束后,使用ReleaseMutex(THandle

    提示临界区与事件对象(比如互斥对象)的最大的区别是在性能上。临界区在没有线程冲突时,要用10~15个时间片,而事件对象由于涉及到系统内核要用400~600个时间片。 使用互斥的步骤: 1、声明一个类型为Thandle或Hwnd...

    epoll的reactor模型实现

    Reactor 模型开发效率上比起直接使用 IO 复用要高,它通常是单线程的,设计目标是希望单线程使用一颗 CPU 的全部资源,但也有附带优点,即每个事件处理中很多时候可以不考虑共享资源的互斥访问。可是缺点也是明显的...

    操作系统-读者写者算法-ReaderAndWriter.zip

    写者优先的附加限制:如果一个读者中请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写...

    操作系统课程设计(完美程序)

    写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写...

    C#中实现线程同步lock关键字的用法详解

    如果需要对它们进行互斥访问限制,可以使用System.Threading.Interlocked类提供的方法,这个类是提供原子操作的。 3. lock(this)的使用要慎重。共有类型中使用lock(this),如果新的对象被创建并加锁,极易造成死锁。

    操作系统课程设计-读者写者问题

    写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写...

    读写者实现问题 操作系统

    写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写...

    读者写者问题写者优先实现

    写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写...

    C语言模拟读者写者问题

    写者优先的附加限制:如果一个读者申请进行读操作时已有另一个写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写...

    Delphi多线程编程之三 同步读写全局数据

    提示临界区与事件对象(比如互斥对象)的最大的区别是在性能上。临界区在没有线程冲突时,要用10~15个时间片,而事件对象由于涉及到系统内核要用400~600个时间片。 使用互斥的步骤: 1、声明一个类型为Thandle或Hwnd...

    东华大学 操作系统实验 读者写者问题 含源代码和报告

    写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源 则该读者必须等到没有写者处于等待状态后才能开始读操作 运行结果显示要求:要求在每个线程创建 发出读写操作申请 开始读写操作...

    Linux系统编程之线程同步

    但通过“锁”就将资源的访问变成互斥操作,而后与时间有关的错误也不会再产生了。 但,应注意:同一时刻,只能有一个线程持有该锁。 当A线程对某个全局变量加锁访问,B在访问前尝试加锁,拿不到锁,B阻塞。C...

    write_first.rar_write first_读者 写者 _读者写者

    写者优先问题。操作限制:1)写-写互斥;2)读-写互斥;...写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。

    实时控制系统中优先级反转问题的解决方法

    以实时操作系统μC/OS-II为例,分析了产生优先级反转的原因,提出了解决该问题的2种方法,即互斥信号量...在保证共享资源互斥访问的前提下,将优先级反转的发生有效地限制在一个层次上,降解了优先级反转现象的发生。

    操作系统课程设计读者-写者问题的实现

    写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写...

Global site tag (gtag.js) - Google Analytics