美文网首页
如何保证两个线程之间共享数据

如何保证两个线程之间共享数据

作者: 架构师奶爸 | 来源:发表于2020-10-01 17:15 被阅读0次

Java 里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性原子性。Java 内存模型(JMM)解决了可见性和有序性的问题,而锁解决了原子性的问题,理想情况下我们希望做到“同步”和“互斥”。有以下常规实现方法:

一、将数据抽象成一个类,并将数据的操作作为这个类的方法;

  1. 将数据抽象成一个类,并将对这个数据的操作作为这个类的方法,这么设计可以和容易做到同步,只要在方法上加”synchronized“。
public class MyData
{
    private int j = 0;
    public synchronized void add()
    {
        j++;
        System.out.println("线程" + Thread.currentThread().getName() + "j 为:" + j);
    }
    public synchronized void dec()
    {
        j--;
        System.out.println("线程" + Thread.currentThread().getName() + "j 为:" + j);
    }
    public int getData()
    {
        return j;
    }
}
public class AddRunnable implements Runnable
{
    MyData data;
    public AddRunnable(MyData data)
    {
        this.data = data;
    }
    public void run()
    {
        data.add();
    }
}
public class DecRunnable implements Runnable
{
    MyData data;
    public DecRunnable(MyData data)
    {
        this.data = data;
    }
    public void run()
    {
        data.dec();
    }
}
public static void main(String[] args){
        MyData data = new MyData();
        Runnable add = new AddRunnable(data);
        Runnable dec = new DecRunnable(data);
        for(int i = 0; i < 2; i++)
        {
            new Thread(add).start();
            new Thread(dec).start();
        }
}

二、Runnable对象作为一个类的内部类;

  1. 将Runnable 对象作为一个类的内部类,共享数据作为这个类的成员变量,每个线程对共享数据的操作方法也封装在外部类,以便实现对数据的各个操作的同步和互斥,作为内部类的各个Runnable 对象调用外部类的这些方法。
public class MyData
{
    private int j = 0;
    public synchronized void add()
    {
        j++;
        System.out.println("线程" + Thread.currentThread().getName() + "j 为:" + j);
    }
    public synchronized void dec()
    {
        j--;
        System.out.println("线程" + Thread.currentThread().getName() + "j 为:" + j);
    }
    public int getData()
    {
        return j;
    }
}
public class TestThread
{
    public static void main(String[] args)
    {
        final MyData data = new MyData();
        for(int i = 0; i < 2; i++)
        {
            new Thread(new Runnable()
            {
                public void run()
                {
                    data.add();
                }
            }).start();
            new Thread(new Runnable()
            {
                public void run()
                {
                    data.dec();
                }
            }).start();
        }
    }
}

相关文章

  • 如何保证两个线程之间共享数据

    Java 里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见性和有序性原子性。Jav...

  • java内存模型

    java内存模型的基础 并发编程模型的两个关键问题 线程之间如何通信 共享内存:线程之间共享程序的公共状态,通过写...

  • JMM之重排序&Happens-Before

    并发编程中,需要处理两个关键问题: 线程之间如何通信?—共享内存+消息传递 线程之间如何同步? java的并发采用...

  • android 同步的常用关键字

    欢迎大家下载我个人开发的app安琪花园 1. 如何在多个线程间共享数据 2. 如何保证变量可见性 即在子线程里面...

  • 07 JMM

    1 JMM基础 线程之间如何通信及线程之间如何同步共享内存 java线程之间共享程序的公共状态,通过写-读内存中的...

  • java内存模型笔记一

    1.在并发中处理两个问题:a.线程之间如何通信 b.线程之间如何同步 2.线程之间通信机制:共享内存与消息传递 3...

  • 并发编程模型的二个关键问题

    1.线程之间如何通信2.线程之间如何同步线程之间的通信有两种机制:共享内存,消息传递共享内存: 消息传递: jav...

  • iOS-锁的原理分析(一)

    前言 当我们提到线程时,就会联想到线程不安全,如何保线程安全以及多线程之间数据访问如何保证不出问题呢,带着这些疑问...

  • Java线程相关学习笔记

    Java 线程相关 如何创建线程(两种方式,区别,使用场景)线程状态调度多线程数据共享(会有什么问题,如何实现共享...

  • android中Synchronized的使用

    synchronized是多个线程共享同一个数据,用来保证同一时间只有一个线程在操作共享数据,其他线程要等待这个线...

网友评论

      本文标题:如何保证两个线程之间共享数据

      本文链接:https://www.haomeiwen.com/subject/jgzuuktx.html