直接上代码
package com.nbgame.thread;
import java.util.HashMap;
public class HashMapDemo {
private static HashMap map = new HashMap();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
}
/**
* 减少花费时间的办法之二,减少同步块的代码,减少了争用的时间
*
* @param userName
* @return
*/
public boolean userHasAdminAccess(String userName) {
String key = "users. " + userName + ".accessRights";
String rights;
synchronized (map) {
rights = (String) map.get(key);
}
return ((rights != null) && (rights.indexOf("ADMIN") >= 0));
}
private static HashMap userMap = new HashMap();
private static HashMap serviceMap = new HashMap();
/**
* 减少策略2: 采用2个同步线程来处理争用问题 它用两个单独的散列表来存储用户信息和服务信息,如清单 3 所示。
*
* @param user
* @param userInfo
*/
public synchronized void setUserInfo(String user, UserInfo userInfo) {
userMap.put(user, userInfo);
}
public synchronized UserInfo getUserInfo(String user, UserInfo userInfo) {
return (UserInfo) userMap.get(user);
}
public synchronized void setServiceInfo(String service,
ServiceInfo serviceInfo) {
serviceMap.put(service, serviceInfo);
}
public synchronized ServiceInfo getUserInfo(String service,
ServiceInfo serviceInfo) {
return (ServiceInfo) serviceMap.get(service);
}
/**
* 减少策略3: 它用两个单独的散列表来存储用户信息和服务信息, 并且减少争用的粒度。
*
* @param user
* @param userInfo
*/
public void setUserInfo1(String user, UserInfo userInfo) {
synchronized (userMap) {
userMap.put(user, userInfo);
}
}
public UserInfo getUserInfo1(String user, UserInfo userInfo) {
synchronized (userMap) {
return (UserInfo) userMap.get(user);
}
}
public void setServiceInfo1(String service, ServiceInfo serviceInfo) {
synchronized (serviceMap) {
serviceMap.put(service, serviceInfo);
}
}
public ServiceInfo getUserInfo1(String service, ServiceInfo serviceInfo) {
synchronized (serviceInfo) {
return (ServiceInfo) serviceMap.get(service);
}
}
}
class UserInfo {
private String name;
private int id;
}
class ServiceInfo {
private String name;
private int id;
}
分享到:
相关推荐
随着Java版本的更新,Java也引入了新的并发工具类,例如java.util.concurrent包下的并发集合、原子操作类以及各种并发控制类,这些工具类提供了比传统synchronized和volatile关键字更强大、更灵活的线程同步控制机制...
最后,实验报告应包括心得体会部分,让学生总结在实验中遇到的问题、解决的方法以及通过实验学到的知识点,这对于巩固理论学习和提升实践能力都是非常重要的。 附录中的源代码包括了`ThreadFrame`(主窗口类)、`...
本文从多线程的基础概念出发,深入探讨了Java中多线程的实现机制及线程安全问题,并介绍了几种常见的设计模式(包括单例模式、工厂模式和适配器模式),这些模式有助于解决多线程环境下的常见问题。通过对这些知识点...
在本实验中,通过Windows操作系统提供的API来实现线程间的互斥操作,主要涉及以下几个知识点: 1. **线程创建与撤销**:实验中使用`CreateThread()`函数创建了两个子线程`func1`和`func2`。`CreateThread()`是...
3. 数据同步与通信:Java提供了多种同步机制,如synchronized关键字、wait/notify机制以及并发工具类(如Semaphore、CountDownLatch等),确保线程安全,防止数据不一致。 二、MySQL服务器在点餐系统中的作用 ...
- **多线程**:理解多线程的基本概念,包括线程的创建方式(继承`Thread`类或实现`Runnable`接口)、线程间的同步与互斥等,这对于编写高效并发的应用程序是必不可少的技能。 - **集合类**:熟悉常用的集合接口(如`...
以下是我作为一个经验丰富的开发者在Java学习过程中的几点心得体会: 1. **基础牢固**:学习Java首先需要掌握基础语法,如变量、数据类型、控制流、类与对象等。基础不牢,地动山摇,扎实的基础是进阶学习的关键。 ...
整体来说,文档提供了关于Linux内核代码阅读和理解的丰富知识点,涵盖了启动过程、系统调用、内核模块编译、文件系统设计、内存管理、同步机制、文件读写机制等多方面的内容。通过阅读这样的文档,可以加深对Linux...
生产者与消费者问题是一个非常典型的进程同步问题,通过本课程设计的学习和实践,不仅能够加深对操作系统中进程同步机制的理解,还能够在实际编程过程中得到锻炼,提升自己的编程能力和解决问题的能力。
根据给定的信息,我们可以从标题、描述以及部分内容中提取出几个关键的知识点: ### 1. 编程笔记概述 该编程笔记主要记录了作者在编程过程中遇到的问题、解决方案及心得体会等内容。由于描述中提到“主要包括了...
通过具体的实验操作,学生能够更直观地了解多线程环境下进程间如何进行有效的同步与协作,这对于深入学习操作系统进程管理章节具有重要意义。 ### 实验内容与要求 #### 1. 分析传统生产者-消费者算法的优点与不足 ...
5. **多线程**:学习如何创建和管理线程,理解线程同步和互斥,如synchronized关键字,wait()、notify()方法,以及ThreadLocal和Callable接口的应用。 6. **网络编程**:理解TCP/IP协议,编写Socket客户端和服务端...
5. **多线程**:如何创建和管理线程,以及同步和锁机制。 6. **异常处理**:理解何时抛出异常,如何捕获和处理异常。 7. **泛型**:提升代码复用性和安全性,减少类型转换的麻烦。 8. **反射**:在运行时动态地...
实验的基本思路包括以下几点: 1. 变量:主要的变量是信号量`s`,表示售票厅的剩余容量。 2. 所用函数:包括P(s)和V(s)操作,用于控制进程的同步。 3. 流程图:购票者首先执行P(s),然后购票,最后执行V(s)离开。...
- Exercise2:基于Semaphore实现了一个带锁的列表,使用Condition来实现生产者和消费者的同步,展示了线程间的协作和等待机制。 - Exercise3:设计并实现了Lock,Lock内部包含一个Semaphore,通过Acquire()和Release...
为了解决这些问题,需要使用同步机制来解决线程同步问题,使用多个线程来加快扫描速度,使用connect()系统调用来判断服务器的TCP端口是否打开,并使用UDP协议来实现客户端连接验证。 六、 总结及心得体会 通过该...
本文档主要涵盖了BI平台工程师笔试题的几个关键知识点,包括进程和线程的区别、数据库中的各种组件、删除表中全部数据的方法、往数据库中加载大量数据的方法、生产者消费者模型的基本原理等。 首先,让我们来讨论...
采用SetEvent来设置事件处理线程间的同步问题。 伪代码如下: DWORD WINAPI ThreadOne(LPVOID param) { 对前一半数据进行处理; SetEvent(finish[0]); return 0; } DWORD WINAPI ThreadTwo(LPVOID param) { 对...
采用SetEvent来设置事件处理线程间的同步问题。 伪代码如下: DWORD WINAPI ThreadOne(LPVOID param) { 对前一半数据进行处理; SetEvent(finish[0]); return 0; } DWORD WINAPI ThreadTwo(LPVOID param) { 对...
除了上述基本要求外,还可以考虑以下几点作为扩展学习内容: - **进程间通信**(IPC): 包括管道(pipe)、信号量(semaphore)、共享内存(shared memory)等多种方式。 - **多线程技术**: 学习如何使用线程库如pthread来...