`

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

 
阅读更多
/**
 * @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();// 唤醒其他等待的线程
	}
}

 

分享到:
评论

相关推荐

    用命名互斥量限制应用运行唯一实例

    互斥量是一种同步对象,用于控制多个线程对共享资源或临界区的访问。在Windows操作系统中,互斥量分为两种:未命名互斥量和命名互斥量。命名互斥量可以通过名称在进程间共享,而未命名互斥量仅限于当前进程中使用。 ...

    删除程序的 mutex 互斥句柄

    互斥体主要用于同步多个线程或进程对共享资源的访问,确保同一时间只有一个线程或进程能够访问该资源,从而避免数据冲突和竞态条件。在本场景中,"删除程序的 mutex 互斥句柄" 涉及到游戏外挂和DLL(动态链接库)的...

    易语言线程互斥对象解决

    线程互斥对象允许我们限制对共享资源的访问,防止多个线程同时访问同一资源,从而避免数据竞争和不一致状态。 1. **线程互斥对象(Mutex)**: 线程互斥对象是一种同步机制,当一个线程获得了Mutex的所有权后,...

    易语言利用互斥体禁止程序重复运行

    4. **处理异常情况**:在使用互斥体的过程中,要处理可能的异常,比如网络问题、操作系统资源限制等,确保程序的健壮性。 除了易语言自带的互斥体支持,还可以利用Windows API来实现,例如使用`CreateMutex`和`...

    C#多线程互斥实例 多线程获取同一变量

    例如,`Mutex`允许跨进程的互斥访问,而`Semaphore`则可以控制同时访问资源的线程数量。 测试这个多线程互斥的例子,我们可以创建多个线程,每个线程分别调用`Increment`或`Decrement`方法,然后观察`GetValue`返回...

    操作系统实验报告_进程同步与互斥.doc

    6. 互斥锁:互斥锁是一种同步对象,用于限制多个进程或线程的访问共享资源,避免冲突和混淆。 7. 信号量:信号量是一种同步对象,用于控制进程或线程的执行顺序和访问共享资源。 8. 线程池:线程池是一种编程技术,...

    winform 使用互斥体源码

    在多线程编程中,互斥体是一种锁机制,它允许多个线程访问共享资源,但一次只允许一个线程访问。在WinForm应用中,我们可能希望确保应用程序只能启动一个实例,防止用户意外打开多个窗口,这正是互斥体发挥作用的...

    MFC 实现的进程的互斥与同步

    互斥量用于控制多个线程对共享资源的访问,一次只有一个线程能获得互斥量的所有权。在MFC中,我们可以使用`CMutex`类来实现互斥。创建一个`CMutex`对象,然后调用`Lock`方法尝试获取所有权,`Unlock`方法释放所有权...

    linux上实现多进程和多线程实现同步互斥(源代码)

    5. 信号量(Semaphores):在多线程和多进程中都可用,用于限制对资源的访问数量。`sem_init()`初始化信号量,`sem_wait()`和`sem_post()`进行信号量的获取和释放。 三、同步互斥的实现 在提供的"任务三"压缩包中...

    进程的互斥与同步

    - 使用信号量来限制缓冲区中的最大元素数量。当缓冲区满时,生产者必须等待;当缓冲区空时,消费者必须等待。 - 使用事件对象来通知生产者何时可以生产新的数据,以及通知消费者何时可以消费数据。 - 使用互斥体确保...

    C#实现程序互斥运行

    当然,你也可以根据需要使用非全局Mutex,但这可能会限制互斥的效果。 除了Mutex,还可以使用其他同步对象如NamedPipe、Event等实现类似功能。但Mutex在大多数情况下已经足够,并且相对简单易用。 在实际开发中,...

    实例讲述线程的同步互斥

    - **信号量(Semaphore)**:控制同时访问特定资源的线程数量,可以用于限制并发度。 综上所述,线程同步互斥对于构建稳定、高效的多线程程序至关重要。通过合理使用各种同步机制,我们可以确保程序在并发环境下的...

    进程的同步与互斥

    进程的同步与互斥是操作系统中的核心概念,用于管理和协调多任务执行的顺序和资源访问。在MFC(Microsoft Foundation Classes)框架下,我们可以利用其丰富的界面和消息处理机制来模拟这一过程,以便更好地理解这些...

    8. 递归互斥信号量.zip

    递归互斥信号量结合了这两种信号量的特点,它具有计数功能,但又限制了只能由当前持有者再次获取。 递归互斥信号量的实现原理是增加了一个持有次数字段。当一个任务已经持有该信号量并再次尝试获取时,持有次数会...

    BOS V6.2开发指南-网络互斥

    数据互斥则是在对特定数据记录进行操作时,限制其他用户或程序访问该记录。这是确保数据准确性的必要手段,比如在修改一张单据时,需要确保此时没有其他用户也在修改这张单据。 ### 网络互斥的开发实现 #### 功能...

    Windows临界区,内核事件,互斥量,信号量

    在Windows操作系统中,线程同步是一个非常重要...- 信号量适用于需要控制访问资源数量的场景,例如,限制对资源池的访问。 在实际开发中,开发者应根据具体的同步需求选择合适的同步机制,以保证程序的正确性和效率。

    Multhread.rar_互斥

    通过引入互斥锁,当一个线程获得锁并开始执行临界区(即需要互斥访问的代码段)时,其他线程将被阻塞,直到持有锁的线程释放它。 在多线程编程中,除了互斥之外,还有其他同步机制,比如信号量(Semaphore)、条件...

    解决多线程编程中的同步互斥问题

    但是需要注意的是,关键段仅能解决单个CPU核心上的互斥访问问题,对于多处理器或多核心环境下的同步问题可能需要采用更高级别的同步机制,如互斥锁(Mutex)或信号量(Semaphore)等。此外,虽然本示例代码展示了...

    JAVA实现线程间同步与互斥生产者消费者问题

    1. **synchronized关键字**:Java的`synchronized`关键字可以确保同一时间只有一个线程可以访问特定的代码块或方法,从而实现互斥访问。在这个例子中,生产者和消费者可能会使用共享的数据结构(如队列)来存储和...

    多线程编程和操作系统线程同步互斥演示

    5. **信号量(Semaphore)**:信号量可以控制同时访问资源的线程数量,例如限制最多只有N个线程可以访问特定资源。 6. **进度条**:在多线程应用中,进度条常用来反馈任务的完成程度。更新进度条通常需要线程同步,...

Global site tag (gtag.js) - Google Analytics