I try to do a testing for HashTable Sychronized behavior today.

As an Sychronized Object, HashTable already an Sychronized at put and get function. I wanna to know more about the iterator behaviors on multi-threading.

 package leetcode;

 import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry; public class MultiThread {
static Hashtable<Integer, Integer> sharedTable = new Hashtable<Integer, Integer>();
static final class ThreadOne implements Runnable{
public ThreadOne(){ }
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Thread One running: add key-value pair to sharedTable");
for(int i = 0; i < 20; i ++){
sharedTable.put(i, i);
System.out.println("Put " + i + " into sharedTable");
}
}
} static final class ThreadTwo implements Runnable{
public ThreadTwo(){ }
@Override
public void run(){
System.out.println("Thread Two running: iterate the hashtable");
Iterator it = sharedTable.entrySet().iterator();
while(it.hasNext()){
Entry<Integer, Integer> entry = (Entry<Integer, Integer>) it.next();
System.out.println("entry in sharedTable:" + entry.getKey() +" with value:" + entry.getValue());
}
}
} public static void main(String[] agrs){
ThreadOne t1 = new ThreadOne();
ThreadTwo t2 = new ThreadTwo();
System.out.println("Thread start...");
new Thread(t1).start();
new Thread(t2).start();
System.out.println("Thread all started.");
}
}

I make two thread.

ThreadOne do put to hashTable.

ThreadTwo use an iterator to traversal the hashTable.

However, the output is:

 Thread start...
Thread all started.
Thread Two running: iterate the hashtable
Thread One running: add key-value pair to sharedTable
Put 0 into sharedTable
Put 1 into sharedTable
Put 2 into sharedTable
Put 3 into sharedTable
Put 4 into sharedTable
Put 5 into sharedTable
Put 6 into sharedTable
Put 7 into sharedTable
Put 8 into sharedTable
Put 9 into sharedTable
Put 10 into sharedTable
Put 11 into sharedTable
Put 12 into sharedTable
Put 13 into sharedTable
Put 14 into sharedTable
Put 15 into sharedTable
Put 16 into sharedTable
Put 17 into sharedTable
Put 18 into sharedTable
Put 19 into sharedTable

Iterator is initated, however it.hasNext() return false and then exit.

This means that Iterator is broken by put function. It is not sychronized for thread.

So how to make it sychronized?

 package leetcode;

 import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map.Entry; public class MultiThread {
static final class Shared{
private static Hashtable<Integer, Integer> sharedTable = new Hashtable<Integer, Integer>(); public Shared(){
sharedTable = new Hashtable<Integer, Integer>();
}
public synchronized static void put(Integer key, Integer val){
System.out.println("put (" + key + ":" + val + ")into sharedTable.");
sharedTable.put(key, val);
} public synchronized static Integer get(Integer key){
return sharedTable.get(key);
} public synchronized static Boolean containsKey(Integer key){
return sharedTable.containsKey(key);
} public synchronized static void traversal(){
System.out.println("traversal on the sharedTable...");
Iterator it = sharedTable.values().iterator();
while(it.hasNext()){
Integer val = (Integer)it.next();
System.out.println("sharedTable contains val: " + val);
}
System.out.println("Finish traversal.");
} }
static final class ThreadOne implements Runnable{
public ThreadOne(){ }
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Thread One running: add key-value pair to sharedTable");
for(int i = 0; i < 20; i ++){
Shared.put(i, i);
}
}
} static final class ThreadTwo implements Runnable{
public ThreadTwo(){ }
@Override
public void run(){
System.out.println("Thread Two running: iterate the hashtable");
Shared.traversal();
}
} public static void main(String[] agrs) throws InterruptedException{
ThreadOne t1 = new ThreadOne();
ThreadTwo t2 = new ThreadTwo();
System.out.println("Thread start...");
new Thread(t1).start();
Thread.sleep(1);
new Thread(t2).start();
System.out.println("Thread all started.");
}
}

One way to solve is put sharedResources into an Bean. And for all getter / setter / traversal make them sychronized. All the customer/ producor have to call this class to use resources( this is the idea of broker, who is working between clinet and servers).

output:

 Thread start...
Thread One running: add key-value pair to sharedTable
put (0:0)into sharedTable.
put (1:1)into sharedTable.
put (2:2)into sharedTable.
put (3:3)into sharedTable.
Thread all started.
put (4:4)into sharedTable.
put (5:5)into sharedTable.
put (6:6)into sharedTable.
Thread Two running: iterate the hashtable
put (7:7)into sharedTable.
traversal on the sharedTable...
sharedTable contains val: 7
sharedTable contains val: 6
sharedTable contains val: 5
sharedTable contains val: 4
sharedTable contains val: 3
sharedTable contains val: 2
sharedTable contains val: 1
sharedTable contains val: 0
Finish traversal.
put (8:8)into sharedTable.
put (9:9)into sharedTable.
put (10:10)into sharedTable.
put (11:11)into sharedTable.
put (12:12)into sharedTable.
put (13:13)into sharedTable.
put (14:14)into sharedTable.
put (15:15)into sharedTable.
put (16:16)into sharedTable.
put (17:17)into sharedTable.
put (18:18)into sharedTable.
put (19:19)into sharedTable.

Or dont sychronized the whole function, only for the part that use the resource. In this way, actually we dont need an specific class to encapture the resources:

 package leetcode;

 import java.util.Hashtable;
import java.util.Iterator; public class MultiThread {
static final class ThreadOne implements Runnable{
public ThreadOne(){ }
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("Thread One running: add key-value pair to sharedTable");
for(int i = 0; i < 100; i ++){
synchronized(sharedTable){
System.out.println("put (" + i + ":" + i + ")into sharedTable.");
sharedTable.put(i, i);
}
}
}
} static final class ThreadTwo implements Runnable{
public ThreadTwo(){ }
@Override
public void run(){
System.out.println("Thread Two running: iterate the hashtable");
System.out.println("traversal on the sharedTable...");
synchronized(sharedTable){
Iterator it = sharedTable.values().iterator();
while(it.hasNext()){
Integer val = (Integer)it.next();
System.out.println("sharedTable contains val: " + val);
}
}
System.out.println("Finish traversal.");
}
} public static void main(String[] agrs) throws InterruptedException{
ThreadOne t1 = new ThreadOne();
ThreadTwo t2 = new ThreadTwo();
System.out.println("Thread start...");
new Thread(t1).start();
Thread.sleep(1);
new Thread(t2).start();
System.out.println("Thread all started.");
}
private static Hashtable<Integer, Integer> sharedTable = new Hashtable<Integer, Integer>();
}

multi thread for Java的更多相关文章

  1. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory

    学习架构探险,从零开始写Java Web框架时,在学习到springAOP时遇到一个异常: "C:\Program Files\Java\jdk1.7.0_40\bin\java" ...

  2. Exception in thread "main" java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter.<init>(I)V

    在学习CGlib动态代理时,遇到如下错误: Exception in thread "main" java.lang.NoSuchMethodError: org.objectwe ...

  3. GUI学习中错误Exception in thread "main" java.lang.NullPointerException

    运行时出现错误:Exception in thread "main" java.lang.NullPointerException 该问题多半是由于用到的某个对象只进行了声明,而没 ...

  4. 执行打的maven jar包时出现“Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for Manifest main attributes”

    Exception in thread "main" java.lang.SecurityException: Invalid signature file digest for ...

  5. Exception in thread "main" java.lang.ExceptionInInitializerError

    Exception in thread "main" java.lang.ExceptionInInitializerErrorCaused by: java.util.Missi ...

  6. 编译运行java程序出现Exception in thread "main" java.lang.UnsupportedClassVersionError: M : Unsupported major.minor version 51.0

    用javac编译了一个M.java文件, 然后用java M执行,可是出现了下面这个错误. Exception in thread "main" java.lang.Unsuppo ...

  7. dom4j使用xpath报异常 Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/NamespaceContext

    Exception in thread "main" java.lang.NoClassDefFoundError: org/jaxen/NamespaceContext      ...

  8. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1

    场景:eclipse中编写java中用到数组 问题: 程序不报错但是运行过程中 终止,显示字样 “ Exception in thread "main" java.lang.Arr ...

  9. dbca:Exception in thread "main" java.lang.UnsatisfiedLinkError: get

    在64位的操作系统安装oracle10g 软件安装完成后,使用dbca建库的时候报下面的错: $ dbcaUnsatisfiedLinkError exception loading native l ...

随机推荐

  1. AGC 005 D - ~K Perm Counting

    D - ~K Perm Counting 链接 题意: 求有多少排列对于每个位置i都满足$|ai−i|!=k$.n<=2000 分析: 容斥+dp. $answer = \sum\limits_ ...

  2. C语言编译过程以及gcc编译参数

    1.1       C语言编译过程,gcc参数简介 1.1.1          C语言编译过程 一.gcc - o a a.c -o:指定文件输出名字 二.C语言编译的过程: 1.1.1       ...

  3. Redis源码阅读(六)集群-故障迁移(下)

    Redis源码阅读(六)集群-故障迁移(下) 最近私人的事情比较多,没有抽出时间来整理博客.书接上文,上一篇里总结了Redis故障迁移的几个关键点,以及Redis中故障检测的实现.本篇主要介绍集群检测 ...

  4. 《how tomcat works》阅读笔记 - 2 - 门面设计模式,避免强制转换

    在第二章 2.3节中 try { servlet = (Servlet) myClass.newInstance(); servlet.service((ServletRequest) request ...

  5. 占位符golang

    定义示例类型和变量 type Human struct { Name string } var people = Human{Name:"zhangsan"} 普通占位符 占位符 ...

  6. 记一次线上gc调优的过程

           近期公司运营同学经常表示线上我们一个后台管理系统运行特别慢,而且经常出现504超时的情况.对于这种情况我们本能的认为可能是代码有性能问题,可能有死循环或者是数据库调用次数过多导致接口运行 ...

  7. HTTP-HTTPS区别

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...

  8. IOS上z-index和fixed定位无效

    IOS上z-index和fixed定位无效 在该元素上加: -webkit-transform:translateZ(1px); -moz-transform:translateZ(1px); -o- ...

  9. LIFI热火下的VLC基本链路、标准及发展问题

    和白炽及荧光灯相比,白光发光二极管(LED)具有寿命长.光效高.功耗低.无辐射.安全性好.可靠性高等特点,被称为"绿色照明"并得到迅猛发展.白光LED在未来市场极具竞争力.世界范围 ...

  10. Final发布 -----欢迎来怼团队

    欢迎来怼项目小组—Final发布展示 一.小组成员 队长:田继平 成员:葛美义,王伟东,姜珊,邵朔,阚博文 ,李圆圆 二.文案+美工展示 链接:http://www.cnblogs.com/js201 ...