现在我有一个需求:
用户想发起一个请求,用户必须输入一个Licence Key,然后查看有没有权限访问,并且返回可用数量,然后后台有很多的线程会操作这个变量。
我本来是准备把这个变量存储在表中,根据用户输入的Licence Key去查看,但分析发现存在一个时间差的问题
![](http://dl2.iteye.com/upload/attachment/0108/7124/51c46904-ae8a-3427-a780-a1ac37532b02.png)
就是我从数据库获取一个值,但是返回给用户的过程中,后台的很多线程还是在操作这个变量,就是因为这个时间差,导致用户获取的值
修改后的模式如下:
![](http://dl2.iteye.com/upload/attachment/0108/7126/c4e7f55d-ce0d-3f2e-873f-8646a05206ab.png)
代码实现如下:
package com.message.application; import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable; public class ApplicationValue { private static Hashtable licenceKeyHashTable; static { System.out.println("ApplicationValue static代码块"); licenceKeyHashTable = new Hashtable(); licenceKeyHashTable.put("A", 1000000); } public static long getLicenKeyValue() { long value = Long.parseLong(licenceKeyHashTable.get("A").toString()); return value; } public static void setLicenKeyValue(long val) { licenceKeyHashTable.put("A", val); } }
quartz实现
package com.message.quartz.schedule; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.message.application.ApplicationValue; import com.message.application.MessageContext; import com.message.services.interfaces.IMessageSV; public class MessageSchedule { private static Log log = LogFactory.getLog(MessageSchedule.class); public void send() throws Exception { log.info("=========================START========================="); //log.info(arg0); long currentVal = ApplicationValue.getLicenKeyValue(); log.info("当前线程名称:"+Thread.currentThread().getName()+":"+currentVal); if(getModNum() == 1) { log.info("名称为1的线程sleep3秒"); Thread.currentThread().sleep(3000); } ApplicationValue.setLicenKeyValue(--currentVal); log.info("=========================END========================="); } public void send2() throws Exception { log.info("=========================START========================="); int modNum = getModNum(); IMessageSV sv = (IMessageSV) MessageContext.getBean("IMessageSV"); sv.dealMessages(modNum); log.info("=========================END========================="); } public static int getModNum() { String tName = Thread.currentThread().getName(); String modNum = tName.substring(tName.length() - 1, tName.length()); log.info(tName + "-----modNum:" + modNum); return Integer.parseInt(modNum); } }
日志比较多,有兴趣的,可以看看附件“execute.rar”
今天的这个场景,正好再次证明我之前的文章,Hashtable是线程安全的,10个线程并发操作,
但是我对线程1,休息3秒,后续的线程都是等待线程1执行完成后再次执行,看来某钱的面试,还是有意义的~~
相关推荐
java多线程并发的在新窗口
Java多线程是Java编程中的重要概念,它允许...理解并掌握Java多线程下变量共享的原理和解决方案,有助于编写出高效、稳定的并发程序。在实际开发中,应结合具体业务场景选择合适的同步机制,以达到最佳性能和安全性。
在Java编程语言中,多线程是并发执行任务的关键特性,极大地提高了程序的效率和响应速度。本小练习主要关注如何通过继承`Thread`类来创建并运行双线程,以便从1累加到100。下面我们将深入探讨这个话题。 首先,`...
Java中的多线程是面试中常见的话题,涵盖了操作系统的基础概念以及Java并发库的高级特性。...了解这些概念有助于深入理解Java多线程编程,它们在面试中常常作为考察点,对于开发高效、可靠的并发应用程序至关重要。
【JAVA多线程总结】 Java 多线程是Java编程中的关键...Java多线程涉及的内容广泛,理解并熟练掌握这些知识对于编写高效、安全的并发程序至关重要。在实际开发中,应根据具体需求选择合适的方法和工具来处理并发问题。
本资源“java多线程设计模式详解”涵盖了这一主题的深入探讨,包括PDF文档和源码示例。 多线程设计模式是程序员在开发高效、稳定且可维护的多线程应用程序时遵循的一系列最佳实践。以下是一些常见的Java多线程设计...
总的来说,这个项目涉及到Java多线程编程、GUI设计、对象间的通信以及线程同步等多个核心概念,是学习和实践Java并发编程的好例子。通过理解和分析这个项目,开发者不仅可以深入理解Java的并发机制,还能掌握如何在...
Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境下高效、安全地组织代码执行。本文将深入探讨几种常见的Java多线程设计模式,并提供源码实例进行详细解析。 一、生产者消费者模式 生产者...
总之,“Java多线程编程实战指南+设计模式篇(全部)”是一份宝贵的资源,它将帮助读者深入理解Java多线程编程的各个方面,以及如何利用设计模式解决实际问题。学习并掌握这些知识,对于提升Java程序员的专业技能和...
在本实验报告中,我们关注的是Java多线程编程,这是Java编程中一个重要的主题,尤其是在并发处理和高性能系统设计中。线程是操作系统分配CPU时间的基本单位,它允许一个程序内部同时执行多个任务,提高了应用程序的...
通过以上分析,我们可以看出,Java多线程下载涉及到了Java多线程编程、并发控制、网络通信等多个方面的知识,是提高文件下载效率的有效手段。在实践中,需要结合具体需求进行合理的优化,以达到最佳效果。
Java多线程编程是Java开发中的重要组成部分,尤其对于大型应用程序和并发性能要求较高的系统而言。虽然Java在多线程方面可能不如C++灵活,但Java提供了强大的平台无关性和自动内存管理,使得开发者可以专注于并发...
Java多线程是Java编程中的一个核心概念,它允许程序同时执行...通过这个“Java多线程讲座”,你将全面了解Java中的线程编程,学会如何创建、管理和优化线程,以及处理并发问题,为开发高效的多线程应用打下坚实的基础。
Java多线程设计模式是Java编程中不可或缺的一部分,它涉及到如何在并发环境中高效、安全地组织代码执行。在多核处理器和分布式系统普遍存在的今天,理解并熟练掌握多线程设计模式对于提升软件性能和可维护性至关重要...
### 多线程单例模式并发访问 #### 一、多线程基础概念 在讨论多线程单例模式及并发访问之前,我们先来了解一些基本概念。 **进程**和**线程**是计算机科学中的两个核心概念,它们之间的关系紧密而复杂。 - **进程...
Java多线程设计模式是Java开发中不可或缺的一部分,它涉及到并发编程的核心概念和技术。在Java中,多线程可以提高程序的执行效率,通过合理利用CPU资源,使得多个任务能够同时进行。本压缩包文件“java多线程设计...