传统多线程之前如何共享数据

简介: <h3 style="margin-top:1em; margin-bottom:16px; line-height:1.43; font-size:1.5em; color:rgb(51,51,51); font-family:'Helvetica Neue',Helvetica,'Segoe UI',Arial,freesans,sans-serif,'Apple Color Emoj

几种方式

  • 线程执行代码相同,使用同一Runnable对象,Runnable对象中有共享数据
  • 线程执行代码不同,将共享数据封装在另一对象中(操作数据的方法也在该对象完成),将这个对象逐一传递给各个Runnable对象。[本质:共享数据的对象作为参数传入Runnable对象]
  • 线程执行代码不同,将Runnable对象作为某一个类的内部类,共享数据作为这个外部类的成员变量(操作数据的方法放在外部类)。[本质:不同内部类共享外部类数据]
  • 结合上两种方式,将共享数据封装在另一对象中(操作数据的方法也在该对象完成),该对象作为这个外部类的成员变量,将Runnable对象作为内部类

最后一种方式的示例:

设计5个线程,其中三个线程每次对j增加1,另外两个线程对j每次减少1

package com.iot.thread;


public class MutiThreadShareData {

    private static MutiShareData mutiShareData = new MutiShareData();

    public static void main(String[] args) {

        for(int i=0;i<3;i++){
            new Thread(
                    new Runnable() {
                        @Override
                        public void run() {
                            System.out.println(Thread.currentThread()+":{j from "+ mutiShareData.getJ()+" + to: "+mutiShareData.increment()+"}");
                        }
                    }
            ).start();
        }

        for(int i=0;i<2;i++){
            new Thread(
                    new Runnable() {
                        @Override
                        public void run() {
                            System.out.println(Thread.currentThread()+":{j from "+ mutiShareData.getJ()+" - to: "+mutiShareData.decrement()+"}");
                        }
                    }
            ).start();
        }
    }

}

/**
 * 将共享数据封装在另一对象中(操作数据的方法也在该对象完成)
 */
class MutiShareData{
    private int j = 0;
    public synchronized  int increment(){
        return  ++j;
    }
    public synchronized int  decrement(){
        return --j;
    }

    public synchronized int getJ() {
        return j;
    }

    public synchronized void setJ(int j) {
        this.j = j;
    }
}
目录
相关文章
|
1月前
|
缓存 安全 Java
保障线程安全性:构建可靠的多线程应用
保障线程安全性:构建可靠的多线程应用
|
3月前
|
安全
多线程和异步编程:什么是线程安全?如何确保在多线程环境下的数据安全性?
多线程和异步编程:什么是线程安全?如何确保在多线程环境下的数据安全性?
54 3
【并发技术03】传统线程互斥技术—synchronized
【并发技术03】传统线程互斥技术—synchronized
|
8月前
|
Java
架构系列——线程通信的实现方式
架构系列——线程通信的实现方式
|
8月前
|
安全 数据库
【并发技术06】线程范围内共享数据
【并发技术06】线程范围内共享数据
【并发技术08】多个线程间共享数据
【并发技术08】多个线程间共享数据
|
8月前
|
Java
【并发技术01】传统线程技术中创建线程的两种方式
【并发技术01】传统线程技术中创建线程的两种方式
|
9月前
|
Java 数据处理
多线程永动任务设计与实现
多线程永动任务设计与实现
|
11月前
|
消息中间件 存储 算法
多线程概念,常用接口与多进程之间的比较
多线程概念,常用接口与多进程之间的比较
50 0
|
11月前
|
数据安全/隐私保护 C++
【C++11多线程】多线程之数据共享
【C++11多线程】多线程之数据共享

相关实验场景

更多