Java进程间的同步与互斥实例(实现读者写者问题)

来源:互联网 发布:北京大学软件微电子 编辑:程序博客网 时间:2024/04/30 19:56

题目描述:

给定一个队列A[1-10][1-100000]、元素编号1-10,其中每个元素包含10万个随机数。创建若干个线程,各循环100次;其中10,100个为读线程,10,100个为更新线程。

1.    读线程每次产生随机数三元组:(i, j, k),其中i:[1-10], j: [1-100000],k[j-100000],求取指定A[i]一级数组中第j到第k个元素的均值;

2.    更新线程每次产生一对随机整数三元组 (i, j, k) 和一个随机浮点数d:(0-1),其中i: [1-10], j: [1-100000],k[j-100000],完成对A[i][j]到A[i][k]之间的所有元素进行数值更新,x = x * (1 + d)



基础知识:

读者—写者问题(Readers-Writers problem)也是一个经典的并发程序设计问题,是经常出现的一种同步问题。计算机系统中的数据(文件、记录)常被多个进程共享,但其中某些进程可能只要求读数据(称为读者Reader);另一些进程则要求修改数据(称为写者Writer)。就共享数据而言,Reader和Writer是两组并发进程共享一组数据区,通常要求满足:
(1)允许多个读者同时执行读操作;
(2)不允许读者、写者同时操作;

(3)不允许多个写者同时操作。

实现的原理:

Semaphore当前在多线程环境下被扩放使用,操作系统的信号量是个很重要的概念,在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制,Semaphore可以控制某个资源可被同时访问的个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。比如在Windows下可以设置共享文件的最大客户端访问个数。 

Semaphore实现的功能就类似厕所有5个坑,假如有10个人要上厕所,那么同时只能有多少个人去上厕所呢?同时只能有5个人能够占用,当5个人中 的任何一个人让开后,其中等待的另外5个人中又有一个人可以占用了。另外等待的5个人中可以是随机获得优先机会,也可以是按照先来后到的顺序获得机会,这取决于构造Semaphore对象时传入的参数选项。单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场合。

Semaphore维护了当前访问的个数,提供同步机制,控制同时访问的个数。在数据结构中链表可以保存“无限”的节点,用Semaphore可以实现有限大小的链表。另外重入锁 ReentrantLock 也可以实现该功能,但实现上要复杂些。


编程实现:

工程下载地址:http://download.csdn.net/detail/qq_24369113/9720663

ReadAndWrite.java是测试类

ReadThread.java是读线程类

WriteThread.java是写线程类

默认生成100个读线程和100个写线程,每个线程循环100次,ReadAndWrite.java中的Value数组模拟临界区资源,对其每一行设置一个锁,对每一行允许同时最多有5个读线程进行操作,或者一个写线程进行操作。


ReadThread.java

import java.util.HashMap;import java.util.Map;import java.util.Random;import java.util.concurrent.Semaphore;/** * Created by 32706 on 2016/12/24. */public class ReadThread extends Thread{    public int id;// 读者ID    //public  static  int readCount=0;// 读者数量    public static Map<Integer,Integer> readCountMap=new HashMap<>();//存放每一行的读者数量    public static Map<Integer,Semaphore> mutex=new HashMap<>();//确保在更新readCountMap的原子性    public static void init_readthread_readcountmap()    {        for(int i=0;i<ReadAndWrite.Value.length;i++)        {            readCountMap.put(i,0);            mutex.put(i,new Semaphore(1));        }    }    public ReadThread(int id)    {        this.id = id;    }    private double get_avrage(int i,int j,int k)    {        double sum=0;        for(int r=j;r<=k;r++)            sum=ReadAndWrite.Value[i][r]+sum;        return sum/(k-j+1);    }    //读者优先    public void run()    {        try{            for(int x=0;x<ReadAndWrite.execute_times;x++)            {                int thread_i=(int)(Math.random()*20)%10;                int thread_j=(int) (Math.random()*200000)%100000;                int thread_k=(int)(Math.random()*200000)%(100000-thread_j)+thread_j;                try                {                    System.out.println(id+"号读线程准备读取第"+thread_i+"行的"+thread_j+"=>"+thread_k+"的数据"+"                                                "+ System.currentTimeMillis());                    mutex.get(thread_i).acquire();                    if (readCountMap.get(thread_i) == 0)//如果是第i行的第一个读者,那么要考虑是否有写者,没有写者,直接读,有写者,等待写者                    {                        if(ReadAndWrite.writeSemaphoreMap.get(thread_i).availablePermits()==0)//有人在写                        {                            System.out.println("有写线程在写操作,"+id+"号线程等待读===="+"                                                "+ System.currentTimeMillis());                        }                        ReadAndWrite.writeSemaphoreMap.get(thread_i).acquire();//上写锁                    }                    int  readCount=readCountMap.get(thread_i)+1;// 已经具备读的条件了,读者数量加1                    readCountMap.put(thread_i,readCount);                    mutex.get(thread_i).release();                    if(ReadAndWrite.readCountSemaphoreMap.get(thread_i).availablePermits()==0)//读者过多                    {                        System.out.println("当前读线程过多,"+id+"号线程等待读===="+"                                                "+ System.currentTimeMillis());                    }                    // 等待着读                    ReadAndWrite.readCountSemaphoreMap.get(thread_i).acquire();//如果读者过多则会等待,读者小于5则可以读                    //可以读了                    System.out.println(id+"号读线程正在读取数据...."+"                                                "+ System.currentTimeMillis());                                       System.out.println(id+"号读线程计算结果为~~~~"+get_avrage(thread_i,thread_j,thread_k)+"                                                "+ System.currentTimeMillis());                    mutex.get(thread_i).acquire();                    //读完了,读者数量减少1                    int readCounttem=readCountMap.get(thread_i)-1;                    readCountMap.put(thread_i,readCounttem);                    if(readCountMap.get(thread_i)==0)//没有读者了,可以写了                    {                        ReadAndWrite.writeSemaphoreMap.get(thread_i).release();                    }                    ReadAndWrite.readCountSemaphoreMap.get(thread_i).release();//释放读者信号量                    mutex.get(thread_i).release();                    Thread.sleep((long) (new Random().nextFloat()*1000));                }                catch (InterruptedException e)                {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }        finally{        ReadAndWrite.Runningthread++;    }    }} 


WriteThread.java

/** * Created by 32706 on 2016/12/24. */import java.util.Random;public class WriteThread extends Thread{    public int id;//编号    public WriteThread(int id)    {        this.id=id;    }    private  boolean update_value(int i,int j,int k)    {        double d=Math.random();        for(int r=j;r<=k;r++)            ReadAndWrite.Value[i][r]= ReadAndWrite.Value[i][r]*d;        return true;    }    public void run()    {        try{            for(int x=0;x<ReadAndWrite.execute_times;x++)            {                int thread_i=(int)(Math.random()*20)%10;                int thread_j=(int) (Math.random()*200000)%100000;                int thread_k=(int)(Math.random()*200000)%(100000-thread_j)+thread_j;                try                {                    if(ReadAndWrite.writeSemaphoreMap.get(thread_i).availablePermits()>0)                    {                        System.out.println(id+"号写线程准备更新第"+thread_i+"行的"+thread_j+"=>"+thread_k+"的数据"+"                                                "+ System.currentTimeMillis());                    }                    else                        System.out.println(id+"号写线程准备更新第"+thread_i+"行的数据@@@@@"+"无法获得写锁"+this.id+"号写线程需等待======="+"                                                "+ System.currentTimeMillis());                    ReadAndWrite.writeSemaphoreMap.get(thread_i).acquire();                    System.out.println(this.id+"号写线程正在更新数据...."+"                                                "+ System.currentTimeMillis());                    update_value(thread_i,thread_j,thread_k);//更新数据                    ReadAndWrite.writeSemaphoreMap.get(thread_i).release();                    System.out.println(this.id+"号写线程更新完成~~~~"+"                                                "+ System.currentTimeMillis());                    Thread.sleep((long) (new Random().nextFloat()*1000));                }                catch (InterruptedException e)                {                    // TODO Auto-generated catch block                    e.printStackTrace();                }            }        }        finally{        ReadAndWrite.Runningthread++;    }    }}








ReadAndWrite.java

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.concurrent.Semaphore;/** * Created by 32706 on 2016/12/24. */public class ReadAndWrite {    public static  int ThreadNum=100;//读者写者的数量    public static  int execute_times=10;//每个线程循环的次数    public static  int Runningthread=0;//已经运行完的线程数    public static double[][] Value=new double[10][100000];  //存放临界资源值  所有线程竞争访问    public static Map<Integer,Semaphore> readCountSemaphoreMap=new HashMap();    public static Map<Integer,Semaphore> writeSemaphoreMap=new HashMap();    public static List<ReadThread> readThreadList=new ArrayList<>();//读线程列表    public static List<WriteThread> writeThreadList=new ArrayList<>();//写线程列表    static void init_semaphore()    {        for(int i=0;i<Value.length;i++)        {            Semaphore readCountSemaphore=new Semaphore(5);//最多允许20个读线程            Semaphore writeSemaphore=new Semaphore(1);//最多允许一个写线程            readCountSemaphoreMap.put(i,readCountSemaphore);  //每一行设置一个信号量            writeSemaphoreMap.put(i,writeSemaphore);        }    }    static void init_value()    {        for(int i=0;i<Value.length;i++)            for(int j=0;j<Value[0].length;j++)                Value[i][j]=Math.random()*1000;    }    static void init_thread()    {        for(int i=0;i<ThreadNum;i++)        {            readThreadList.add(new ReadThread(i));            writeThreadList.add(new WriteThread(-(i+1)));        }    }    /**     * @param args     */    public static void main(String[] args)    {        init_value();        init_semaphore();        init_thread();        ReadThread.init_readthread_readcountmap();        for(int i=0;i<ThreadNum;i++)        {           readThreadList.get(i).start();            writeThreadList.get(i).start();        }    }}




实验结果与分析:

为展示方便,读写线程分别 为50个且只循环1次的情况下实验结果如下。

可以观察到,在刚开始运行的时候基本不会发生阻塞,但是当运行一段时间后会出现大量的写线程阻塞,然后大部分的读线程的结果是同时输出的,写线程的读取和更新都出现在最后面。

分析原因可能如下:

大量的写线程出现阻塞是因为本次实现的代码是基于读者优先的策略,只要还有一个读者,写线程就必须等待,而后来的读线程依然可以优先于写线程来读取数据,因此造成了写线程的饥饿状态。

其次大量的读线程同时输出读取完成的结果,推测可能为操作系统为了提高执行效率,尽可能的将所有的计算和输出操作合并了从而来提高调度的效率,从而导致了扎堆输出结果的现象。

最后是写线程更新,当读线程基本都完成了任务之后,写线程才获得写锁,于是最后扎堆更新数据。这一现象在增加线程或者循环次数之后更为明显。


实验结果:

0号读线程准备读取第5行的43663=>82118的数据                                                1483201100549
0号读线程正在读取数据....                                                1483201100550
-1号写线程准备更新第9行的7057=>50513的数据                                                1483201100552
-1号写线程正在更新数据....                                                1483201100552
-1号写线程更新完成~~~~                                                1483201100554
1号读线程准备读取第6行的96899=>99412的数据                                                1483201100555
1号读线程正在读取数据....                                                1483201100555
-2号写线程准备更新第7行的17650=>18818的数据                                                1483201100556
-2号写线程正在更新数据....                                                1483201100556
-2号写线程更新完成~~~~                                                1483201100556
2号读线程准备读取第8行的38029=>71537的数据                                                1483201100557
2号读线程正在读取数据....                                                1483201100557
-3号写线程准备更新第3行的59488=>90920的数据                                                1483201100557
-3号写线程正在更新数据....                                                1483201100557
-3号写线程更新完成~~~~                                                1483201100559
3号读线程准备读取第4行的84629=>97087的数据                                                1483201100561
3号读线程正在读取数据....                                                1483201100562
-4号写线程准备更新第0行的96807=>98089的数据                                                1483201100562
-4号写线程正在更新数据....                                                1483201100563
-4号写线程更新完成~~~~                                                1483201100563
4号读线程准备读取第6行的57697=>66846的数据                                                1483201100563
4号读线程正在读取数据....                                                1483201100563
-5号写线程准备更新第3行的96989=>99490的数据                                                1483201100563
-5号写线程正在更新数据....                                                1483201100563
-5号写线程更新完成~~~~                                                1483201100563
5号读线程准备读取第5行的45062=>65030的数据                                                1483201100564
5号读线程正在读取数据....                                                1483201100564
-6号写线程准备更新第9行的21289=>75585的数据                                                1483201100564
-6号写线程正在更新数据....                                                1483201100564
-6号写线程更新完成~~~~                                                1483201100565
6号读线程准备读取第4行的40886=>42132的数据                                                1483201100568
6号读线程正在读取数据....                                                1483201100568
-7号写线程准备更新第2行的75088=>87597的数据                                                1483201100568
-7号写线程正在更新数据....                                                1483201100568
-7号写线程更新完成~~~~                                                1483201100568
7号读线程准备读取第6行的70024=>78320的数据                                                1483201100574
7号读线程正在读取数据....                                                1483201100575
-8号写线程准备更新第0行的64041=>93960的数据                                                1483201100575
-8号写线程正在更新数据....                                                1483201100575
-8号写线程更新完成~~~~                                                1483201100575
8号读线程准备读取第7行的22795=>84847的数据                                                1483201100576
8号读线程正在读取数据....                                                1483201100576
-9号写线程准备更新第6行的数据@@@@@无法获得写锁-9号写线程需等待=======                                                1483201100576
25号读线程准备读取第9行的26141=>81420的数据                                                1483201100623
25号读线程正在读取数据....                                                1483201100627
-18号写线程准备更新第6行的数据@@@@@无法获得写锁-18号写线程需等待=======                                                1483201100623
18号读线程准备读取第0行的88057=>89450的数据                                                1483201100623
18号读线程正在读取数据....                                                1483201100628
-19号写线程准备更新第8行的数据@@@@@无法获得写锁-19号写线程需等待=======                                                1483201100623
19号读线程准备读取第2行的27321=>37463的数据                                                1483201100623
19号读线程正在读取数据....                                                1483201100628
-20号写线程准备更新第2行的947=>51275的数据                                                1483201100623
20号读线程准备读取第6行的81555=>96691的数据                                                1483201100623
20号读线程正在读取数据....                                                1483201100629
-21号写线程准备更新第7行的数据@@@@@无法获得写锁-21号写线程需等待=======                                                1483201100622
21号读线程准备读取第2行的81773=>84272的数据                                                1483201100622
21号读线程正在读取数据....                                                1483201100630
-22号写线程准备更新第1行的59916=>68540的数据                                                1483201100622
-22号写线程正在更新数据....                                                1483201100631
-22号写线程更新完成~~~~                                                1483201100631
22号读线程准备读取第6行的82567=>95827的数据                                                1483201100622
22号读线程正在读取数据....                                                1483201100635
-23号写线程准备更新第1行的32661=>98686的数据                                                1483201100622
-23号写线程正在更新数据....                                                1483201100637
-23号写线程更新完成~~~~                                                1483201100638
23号读线程准备读取第8行的63631=>97560的数据                                                1483201100622
23号读线程正在读取数据....                                                1483201100638
-24号写线程准备更新第6行的数据@@@@@无法获得写锁-24号写线程需等待=======                                                1483201100622
24号读线程准备读取第9行的5884=>66465的数据                                                1483201100622
24号读线程正在读取数据....                                                1483201100638
-25号写线程准备更新第5行的数据@@@@@无法获得写锁-25号写线程需等待=======                                                1483201100622
-26号写线程准备更新第5行的数据@@@@@无法获得写锁-26号写线程需等待=======                                                1483201100616
26号读线程准备读取第6行的4796=>98492的数据                                                1483201100616
当前读线程过多,26号线程等待读====                                                1483201100638
-27号写线程准备更新第1行的90288=>99799的数据                                                1483201100616
-27号写线程正在更新数据....                                                1483201100641
-27号写线程更新完成~~~~                                                1483201100641
27号读线程准备读取第8行的61069=>83474的数据                                                1483201100616
27号读线程正在读取数据....                                                1483201100641
-28号写线程准备更新第6行的数据@@@@@无法获得写锁-28号写线程需等待=======                                                1483201100616
28号读线程准备读取第6行的20262=>38312的数据                                                1483201100616
当前读线程过多,28号线程等待读====                                                1483201100641
-29号写线程准备更新第0行的47066=>59614的数据                                                1483201100616
29号读线程准备读取第7行的17972=>66885的数据                                                1483201100615
29号读线程正在读取数据....                                                1483201100646
-30号写线程准备更新第7行的数据@@@@@无法获得写锁-30号写线程需等待=======                                                1483201100615
30号读线程准备读取第8行的28737=>30839的数据                                                1483201100615
-31号写线程准备更新第6行的数据@@@@@无法获得写锁-31号写线程需等待=======                                                1483201100615
31号读线程准备读取第5行的63286=>83377的数据                                                1483201100615
31号读线程正在读取数据....                                                1483201100647
-32号写线程准备更新第8行的数据@@@@@无法获得写锁-32号写线程需等待=======                                                1483201100615
32号读线程准备读取第7行的12038=>60320的数据                                                1483201100615
32号读线程正在读取数据....                                                1483201100648
-33号写线程准备更新第6行的数据@@@@@无法获得写锁-33号写线程需等待=======                                                1483201100615
33号读线程准备读取第8行的26134=>65325的数据                                                1483201100615
33号读线程正在读取数据....                                                1483201100648
-34号写线程准备更新第8行的数据@@@@@无法获得写锁-34号写线程需等待=======                                                1483201100615
34号读线程准备读取第0行的14994=>68441的数据                                                1483201100615
34号读线程正在读取数据....                                                1483201100648
-35号写线程准备更新第8行的数据@@@@@无法获得写锁-35号写线程需等待=======                                                1483201100615
35号读线程准备读取第4行的35769=>93971的数据                                                1483201100615
35号读线程正在读取数据....                                                1483201100650
-36号写线程准备更新第5行的数据@@@@@无法获得写锁-36号写线程需等待=======                                                1483201100615
36号读线程准备读取第1行的80268=>85147的数据                                                1483201100615
36号读线程正在读取数据....                                                1483201100651
-37号写线程准备更新第8行的数据@@@@@无法获得写锁-37号写线程需等待=======                                                1483201100615
37号读线程准备读取第9行的94829=>98748的数据                                                1483201100615
37号读线程正在读取数据....                                                1483201100651
-38号写线程准备更新第4行的数据@@@@@无法获得写锁-38号写线程需等待=======                                                1483201100615
38号读线程准备读取第6行的54625=>92242的数据                                                1483201100615
当前读线程过多,38号线程等待读====                                                1483201100651
-39号写线程准备更新第7行的数据@@@@@无法获得写锁-39号写线程需等待=======                                                1483201100615
39号读线程准备读取第8行的53066=>98353的数据                                                1483201100615
当前读线程过多,39号线程等待读====                                                1483201100651
-40号写线程准备更新第9行的24921=>85334的数据                                                1483201100615
40号读线程准备读取第1行的47040=>57130的数据                                                1483201100615
40号读线程正在读取数据....                                                1483201100651
-41号写线程准备更新第4行的数据@@@@@无法获得写锁-41号写线程需等待=======                                                1483201100615
41号读线程准备读取第5行的48015=>62400的数据                                                1483201100615
41号读线程正在读取数据....                                                1483201100651
-42号写线程准备更新第1行的38557=>50219的数据                                                1483201100614
42号读线程准备读取第5行的86436=>87667的数据                                                1483201100614
42号读线程正在读取数据....                                                1483201100651
-43号写线程准备更新第6行的数据@@@@@无法获得写锁-43号写线程需等待=======                                                1483201100614
43号读线程准备读取第0行的62007=>71149的数据                                                1483201100614
-44号写线程准备更新第1行的44618=>57586的数据                                                1483201100614
44号读线程准备读取第1行的75464=>92893的数据                                                1483201100614
44号读线程正在读取数据....                                                1483201100653
-45号写线程准备更新第6行的数据@@@@@无法获得写锁-45号写线程需等待=======                                                1483201100614
45号读线程准备读取第7行的9275=>73425的数据                                                1483201100614
45号读线程正在读取数据....                                                1483201100653
-46号写线程准备更新第9行的90339=>95380的数据                                                1483201100614
46号读线程准备读取第9行的66631=>81262的数据                                                1483201100614
46号读线程正在读取数据....                                                1483201100653
-47号写线程准备更新第1行的45056=>65191的数据                                                1483201100614
47号读线程准备读取第0行的12319=>85602的数据                                                1483201100614
47号读线程正在读取数据....                                                1483201100653
-48号写线程准备更新第3行的4392=>28282的数据                                                1483201100614
48号读线程准备读取第1行的98208=>99144的数据                                                1483201100614
-49号写线程准备更新第7行的数据@@@@@无法获得写锁-49号写线程需等待=======                                                1483201100614
48号读线程正在读取数据....                                                1483201100655
49号读线程准备读取第9行的53531=>66254的数据                                                1483201100614
17号读线程准备读取第4行的19724=>95143的数据                                                1483201100614
-50号写线程准备更新第5行的数据@@@@@无法获得写锁-50号写线程需等待=======                                                1483201100612
-17号写线程准备更新第6行的数据@@@@@无法获得写锁-17号写线程需等待=======                                                1483201100580
16号读线程准备读取第7行的96041=>96823的数据                                                1483201100580
-16号写线程准备更新第1行的46209=>90992的数据                                                1483201100579
15号读线程准备读取第5行的10512=>35033的数据                                                1483201100579
当前读线程过多,15号线程等待读====                                                1483201100655
-15号写线程准备更新第7行的数据@@@@@无法获得写锁-15号写线程需等待=======                                                1483201100579
14号读线程准备读取第4行的57013=>67644的数据                                                1483201100579
14号读线程正在读取数据....                                                1483201100655
-14号写线程准备更新第9行的90850=>98399的数据                                                1483201100579
13号读线程准备读取第5行的49619=>57480的数据                                                1483201100578
-13号写线程准备更新第4行的数据@@@@@无法获得写锁-13号写线程需等待=======                                                1483201100578
12号读线程准备读取第4行的87150=>93405的数据                                                1483201100578
-12号写线程准备更新第5行的数据@@@@@无法获得写锁-12号写线程需等待=======                                                1483201100578
当前读线程过多,12号线程等待读====                                                1483201100656
11号读线程准备读取第8行的31562=>35768的数据                                                1483201100577
当前读线程过多,11号线程等待读====                                                1483201100656
-11号写线程准备更新第7行的数据@@@@@无法获得写锁-11号写线程需等待=======                                                1483201100577
10号读线程准备读取第3行的61887=>87197的数据                                                1483201100577
有写线程在写操作,10号线程等待读====                                                1483201100656
-10号写线程准备更新第7行的数据@@@@@无法获得写锁-10号写线程需等待=======                                                1483201100577
9号读线程准备读取第6行的39764=>87838的数据                                                1483201100576
当前读线程过多,13号线程等待读====                                                1483201100656
16号读线程正在读取数据....                                                1483201100655
17号读线程正在读取数据....                                                1483201100655
49号读线程正在读取数据....                                                1483201100655
-48号写线程正在更新数据....                                                1483201100655
43号读线程正在读取数据....                                                1483201100653
30号读线程正在读取数据....                                                1483201100647
当前读线程过多,9号线程等待读====                                                1483201100656
-48号写线程更新完成~~~~                                                1483201100656
10号读线程正在读取数据....                                                1483201100656
47号读线程计算结果为~~~~445.1415935882712                                                1483201100682
33号读线程计算结果为~~~~501.9232205695053                                                1483201100824
39号读线程正在读取数据....                                                1483201100824
2号读线程计算结果为~~~~502.03562820099813                                                1483201100873
11号读线程正在读取数据....                                                1483201100877
18号读线程计算结果为~~~~317.83328194119343                                                1483201100921
43号读线程计算结果为~~~~354.8028409213475                                                1483201100941
16号读线程计算结果为~~~~500.98907092969625                                                1483201100941
0号读线程计算结果为~~~~500.6677110415498                                                1483201100972
15号读线程正在读取数据....                                                1483201100972
31号读线程计算结果为~~~~500.90429450244034                                                1483201100992
13号读线程正在读取数据....                                                1483201100993
20号读线程计算结果为~~~~500.96571029297235                                                1483201100994
26号读线程正在读取数据....                                                1483201100994
21号读线程计算结果为~~~~388.3765986659637                                                1483201100995
37号读线程计算结果为~~~~502.4005782097092                                                1483201101118
7号读线程计算结果为~~~~500.3522951998895                                                1483201101119
28号读线程正在读取数据....                                                1483201101120
42号读线程计算结果为~~~~508.7754257377147                                                1483201101120
8号读线程计算结果为~~~~501.05938428157737                                                1483201101128
11号读线程计算结果为~~~~494.2690247571691                                                1483201101233
49号读线程计算结果为~~~~137.69201842099002                                                1483201101233
13号读线程计算结果为~~~~500.73843574907147                                                1483201101234
32号读线程计算结果为~~~~489.40224962044226                                                1483201101234
35号读线程计算结果为~~~~502.2958309686695                                                1483201101234
12号读线程正在读取数据....                                                1483201101234
19号读线程计算结果为~~~~500.2699530659435                                                1483201101235
-20号写线程正在更新数据....                                                1483201101235
-20号写线程更新完成~~~~                                                1483201101235
6号读线程计算结果为~~~~499.58330489514464                                                1483201101272
46号读线程计算结果为~~~~280.54451063631814                                                1483201101286
3号读线程计算结果为~~~~505.9160193585956                                                1483201101304
27号读线程计算结果为~~~~499.05989658673644                                                1483201101306
23号读线程计算结果为~~~~498.7208277443622                                                1483201101320
30号读线程计算结果为~~~~502.91275562703277                                                1483201101320
1号读线程计算结果为~~~~491.6822528408746                                                1483201101350
38号读线程正在读取数据....                                                1483201101350
45号读线程计算结果为~~~~492.08537398326655                                                1483201101357
4号读线程计算结果为~~~~496.44147637719004                                                1483201101474
9号读线程正在读取数据....                                                1483201101474
24号读线程计算结果为~~~~146.34935279563345                                                1483201101474
17号读线程计算结果为~~~~501.3599509237377                                                1483201101475
14号读线程计算结果为~~~~501.55683960451165                                                1483201101475
5号读线程计算结果为~~~~498.7436437224846                                                1483201101479
41号读线程计算结果为~~~~499.4052010660233                                                1483201101480
44号读线程计算结果为~~~~299.1534625862364                                                1483201101481
40号读线程计算结果为~~~~339.10359713583284                                                1483201101521
36号读线程计算结果为~~~~338.4601925398067                                                1483201101537
48号读线程计算结果为~~~~79.10397929516115                                                1483201101537
-42号写线程正在更新数据....                                                1483201101537
-42号写线程更新完成~~~~                                                1483201101538
-44号写线程正在更新数据....                                                1483201101538
-44号写线程更新完成~~~~                                                1483201101538
-47号写线程正在更新数据....                                                1483201101538
-47号写线程更新完成~~~~                                                1483201101538
-16号写线程正在更新数据....                                                1483201101538
-16号写线程更新完成~~~~                                                1483201101539
25号读线程计算结果为~~~~149.09428547790054                                                1483201101550
-40号写线程正在更新数据....                                                1483201101551
-40号写线程更新完成~~~~                                                1483201101551
-46号写线程正在更新数据....                                                1483201101551
-46号写线程更新完成~~~~                                                1483201101551
-14号写线程正在更新数据....                                                1483201101551
-14号写线程更新完成~~~~                                                1483201101551
29号读线程计算结果为~~~~493.1034814220995                                                1483201101569
-21号写线程正在更新数据....                                                1483201101569
-21号写线程更新完成~~~~                                                1483201101569
-30号写线程正在更新数据....                                                1483201101569
-30号写线程更新完成~~~~                                                1483201101569
-39号写线程正在更新数据....                                                1483201101569
-39号写线程更新完成~~~~                                                1483201101569
-49号写线程正在更新数据....                                                1483201101569
-49号写线程更新完成~~~~                                                1483201101569
-15号写线程正在更新数据....                                                1483201101569
-15号写线程更新完成~~~~                                                1483201101569
-11号写线程正在更新数据....                                                1483201101569
-11号写线程更新完成~~~~                                                1483201101570
-10号写线程正在更新数据....                                                1483201101570
-10号写线程更新完成~~~~                                                1483201101570
34号读线程计算结果为~~~~483.1882293830117                                                1483201101570
-29号写线程正在更新数据....                                                1483201101593
-29号写线程更新完成~~~~                                                1483201101607
38号读线程计算结果为~~~~499.3677726755843                                                1483201101678
22号读线程计算结果为~~~~499.2626100189864                                                1483201101681
10号读线程计算结果为~~~~0.9588775934820346                                                1483201101683
15号读线程计算结果为~~~~503.4703555844042                                                1483201101718
-25号写线程正在更新数据....                                                1483201101718
-25号写线程更新完成~~~~                                                1483201101718
-26号写线程正在更新数据....                                                1483201101718
-26号写线程更新完成~~~~                                                1483201101718
-36号写线程正在更新数据....                                                1483201101718
-36号写线程更新完成~~~~                                                1483201101718
-50号写线程正在更新数据....                                                1483201101718
-50号写线程更新完成~~~~                                                1483201101718
-12号写线程正在更新数据....                                                1483201101720
-12号写线程更新完成~~~~                                                1483201101720
26号读线程计算结果为~~~~499.949131030842                                                1483201101762
39号读线程计算结果为~~~~499.36666877810234                                                1483201101797
-19号写线程正在更新数据....                                                1483201101797
-19号写线程更新完成~~~~                                                1483201101797
-32号写线程正在更新数据....                                                1483201101797
-32号写线程更新完成~~~~                                                1483201101797
-34号写线程正在更新数据....                                                1483201101797
-34号写线程更新完成~~~~                                                1483201101797
-35号写线程正在更新数据....                                                1483201101803
-37号写线程正在更新数据....                                                1483201101803
-35号写线程更新完成~~~~                                                1483201101803
-37号写线程更新完成~~~~                                                1483201101803
12号读线程计算结果为~~~~510.34993152646615                                                1483201101928
-38号写线程正在更新数据....                                                1483201101928
-38号写线程更新完成~~~~                                                1483201101928
-41号写线程正在更新数据....                                                1483201101928
-41号写线程更新完成~~~~                                                1483201101928
-13号写线程正在更新数据....                                                1483201101928
-13号写线程更新完成~~~~                                                1483201101928
28号读线程计算结果为~~~~501.8493539375079                                                1483201101957
9号读线程计算结果为~~~~499.07400535784046                                                1483201102368
-9号写线程正在更新数据....                                                1483201102368
-9号写线程更新完成~~~~                                                1483201102368
-18号写线程正在更新数据....                                                1483201102368
-18号写线程更新完成~~~~                                                1483201102368
-24号写线程正在更新数据....                                                1483201102368
-24号写线程更新完成~~~~                                                1483201102368
-28号写线程正在更新数据....                                                1483201102368
-28号写线程更新完成~~~~                                                1483201102368
-31号写线程正在更新数据....                                                1483201102368
-31号写线程更新完成~~~~                                                1483201102368
-33号写线程正在更新数据....                                                1483201102368
-33号写线程更新完成~~~~                                                1483201102368
-43号写线程正在更新数据....                                                1483201102368
-43号写线程更新完成~~~~                                                1483201102368
-45号写线程正在更新数据....                                                1483201102368
-45号写线程更新完成~~~~                                                1483201102368
-17号写线程正在更新数据....                                                1483201102368
-17号写线程更新完成~~~~                                                1483201102368


Process finished with exit code 0
                                             
0 0