多线程共享数据

Posted zhulina-917

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程共享数据相关的知识,希望对你有一定的参考价值。

 多个线程行为一致共同操作一个数据,最经典的例子就是卖票

public class ShareData 
    private int num  =10;
    public synchronized void inc()
        num++;
        System.out.println(Thread.currentThread().getName()+"调用inc这个方法num = "+num);
        try 
            Thread.sleep(1000);
         catch (InterruptedException e) 
            e.printStackTrace();
        
    
package com.example.threadTest;

/**
 * Description: hibernate
 * Created by lenovo on 2019/6/1 19:33
 */
public class Ticket implements Runnable
    private ShareData shareData;

    public Ticket(ShareData shareData) 
        this.shareData = shareData;
    

    public Ticket() 

    

    @Override
    public void run() 
        for (int i=0;i<5;i++)
            shareData.inc();
        
    
    public static void main (String[] args)
        ShareData shareData = new ShareData();
        for (int i=0;i<4;i++)
          new Thread(new Ticket(shareData),"Thread"+i).start();
      
    


2.多个线程行为不一致,共同操作一个数据

如果每个线程执行的代码不同这个时候就需要调用不同的Runnable对象,有两种方法实现这个Runnable对象之间的数据共享

,将共享数据封装在另外一个对象中,然后将这些对象逐一传递给各个Runnable对象 ,每一个线程对共享数据的操作方法也分配到那个对象身上去完成,这样就容易实现针对

该数据进行的各个操作的互斥和通信。

哎,先看实现再看这个总结就会恍然大悟。

在共享数据的对象里面添加不同的实现方法

 

package com.example.demo1;

/**
 * Description: hibernate
 * Created by lenovo on 2019/6/1 19:57
 */
public class MyThread implements Runnable
    private SharaData sharaData;
    public MyThread() 

    

    public MyThread(SharaData sharaData) 
        this.sharaData = sharaData;
    

    public static void main (String[] args)

        SharaData sharaData = new SharaData();
        for (int i=0;i<4;i++)
            if (i%2==0)
                new Thread(new MyThread(sharaData),"Thread"+i).start();
            else
                new Thread(new MyThreadDec(sharaData),"Thread"+i).start();
            
        
    
    //封装共享数据类



    @Override
    public void run() 
    for (int i=0;i<5;i++)
        sharaData.inc();

    
    

 

//
package com.example.demo1;
/** * Description: hibernate * Created by lenovo on 2019/6/1 20:07 */ public class MyThreadDec implements Runnable //封装共享数据 private SharaData sharaData; public MyThreadDec(SharaData sharaData) this.sharaData = sharaData; @Override public void run() for (int i=0;i<5;i++) sharaData.dec();
//共享数据类
package com.example.demo1;
/** * Description: hibernate * Created by lenovo on 2019/6/1 19:57 */ public class SharaData private int num =10; public synchronized void inc() num++; System.out.println(Thread.currentThread().getName()+"调用inc这个方法num = "+num); try Thread.sleep(1000); catch (InterruptedException e) e.printStackTrace(); public synchronized void dec() num++; System.out.println(Thread.currentThread().getName()+"调用inc这个方法num = "+num); try Thread.sleep(1000); catch (InterruptedException e) e.printStackTrace();

 

第二种方法

将这些Runnable对象作为一个类中的内部类,共享数据作为这个外部类中的成员变量,你每一个线程对共享数据的操作方法也分配给外部类,、

以便实现对共享数据进行的各个操作的互斥和通信,作为内部类的各个Runnable对象调用外部类的这些方法

package com.example.demo1;

/**
 * Description: hibernate
 * Created by lenovo on 2019/6/1 20:33
 */
public class Thread2 
    public static void main (String[] args)
        final SharaData sharaData =  new SharaData();
       for (int i=0;i<4;i++)
           if (i%2==0)
               new Thread(new Runnable() 
                   @Override
                   public void run() 
                       for (int i=0;i<5;i++)
                           sharaData.inc();
                       
                   
               ,"Thread"+i).start();
           else
                 new Thread(new Runnable() 
                     @Override
                     public void run() 
                         for (int i=0;i<5;i++)
                             sharaData.dec();
                         
                     
                 ,"Thread"+i).start();
           
       
    

 

以上是关于多线程共享数据的主要内容,如果未能解决你的问题,请参考以下文章

多线程编程

C++11多线程 原子操作概念及范例

多线程中共享变量——CCF总决赛试题

多线程开发+多线程使用共享数据-17

java基础入门-多线程同步浅析-以银行转账为样例

八.多进程与多线程