多线程之——共享数据

多线程:多个线程共享数据 在 Java 传统线程机制中的共享数据方式,大致可以简单分两种情况: 多个线程行为一致,共同操作一个数据源。也就是每个线程执行的代码相同,可以使用同一个 Runnable 对象,这个 Runnable 对象中有那个共享数据,例如,卖票系统就可以这么做。 多个线程行为不一致,共同操作一个数据源。也就是每个线程执行的代码不同,这时候需要用不同的Runnable 对象。例如,银行存取款。 1、同样的... 阅读详情

数据不一致

让我们先来看一个案例

public class ShareData {
    //共享数据data
    static int data = 0;    
    public static void main(String[] args) {
        //创建两个线程并启动
        ShareThread1 st1 = new ShareThread1();
        ShareThread2 st2 = new ShareThread2();
        new Thread(st1).start();
        new Thread(st2).start();
    }
    //内部类,访问类中的静态成员变量data
    private static class ShareThread1 implements Runnable{
        //线程1中的run()方法循环输出data,每次循环休眠1秒
        @Override
        public void run() {
            while(data<10){
                try {
                    Thread.sleep(1000);
                    System.out.println("这个小于10的数据是:"+data++);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
        
    }
    //内部类,访问类中的静态成员变量data
    private static class ShareThread2 implements Runnable{
        //线程2中的run()方法变量data自增
        @Override
        public void run() {
            while(data<100){
                data++;
            }
        }
    }
}

我们看到:ShareDate 类中有两个内部类ShareThread1 和ShareThread2类,这两个内部类都共享并访问ShareDate 类中静态成员变量data 。其中ShareThread1类中的run()方法判断:当data 小于10时进行输出,不过在输出前通过调用sleep()方法让该线程等待1秒。而ShareThread2类中的run()方法让data 循环执行自加的操作,直到data 不小于100时停止。

输出结果:

这个小于10的数据是:100

很明显,这并不是我们所希望的结果。出现这样结果的原因是:一开始,当ShareThread1类的对象在判断data <10之时,data 的值是小于10的,所以能进去到run ()方法中的while循环中。但是当进入while 循环后,在输出前需要等待1秒,在这1秒里面,ShareThread2类的线程对象通过run()方法不停地进行data 自加操作,直到data=100停止。此时,ShareThread1类的线程对象再进行输出操作,其结果自然是这个“小于10的data 数据“就变成了100。

  这个案例说明了:当一个数据被多个线程进行读取操作时,通过检查这个数据的值来进行判断并执行之后的操作是极其不安全的。因为在判断之后,这个数据的值很可能已经被其他线程修改了,判断条件也可能已经不成立了,但此时已经过了判断,之后的操作也就“将错就错”地继续进行。


控制共享数据

针对上面的案例中——共享数据data 被不同的线程操作出现了数据不一致的情况,Java 提供了同步机制来解决控制共享数据的问题,Java可以使用synchronized 关键字确保数据在各个线程间共享数据的正确分享。使用synchronized 关键字修改上面案例的代码

public class ShareData2 {
    //共享数据data
    static int data = 0;
    //定义了一个锁对象lock
    static final Object lock = new Object();
    public static void main(String[] args) {
        //创建两个线程并启动
        ShareThread1 st1 = new ShareThread1();
        ShareThread2 st2 = new ShareThread2();
        new Thread(st1).start();
        new Thread(st2).start();
    }
    //内部类,访问类中的静态成员变量data
    private static class ShareThread1 implements Runnable{
        //ShareThread1类中的run()方法循环输出data,每次循环休眠1秒
        @Override
        public void run() {
            //对lock对象上锁
            synchronized (lock) {
                while(data<10){
                    try {
                        Thread.sleep(1000);
                        System.out.println("这个小于10的数据是:"+data++);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
            
        }
    }
    //内部类,访问类中的静态成员变量data
    private static class ShareThread2 implements Runnable{
        //ShareThread2类中的run()方法变量data自增
        @Override
        public void run() {
            //对lock对象上锁
            synchronized (lock) {
                while(data<100){
                    data++;
                }
            }
        }
    }
}
运行结果:

这个小于10的数据是:0
这个小于10的数据是:1
这个小于10的数据是:2
这个小于10的数据是:3
这个小于10的数据是:4
这个小于10的数据是:5
这个小于10的数据是:6
这个小于10的数据是:7
这个小于10的数据是:8
这个小于10的数据是:9
在上面这个程序中,首先定义了一个静态变量lock ,然后在ShareThread1和ShareThread2类的run()方法里,使用synchronized (lock){…}代码对lock 对象“上锁”,其含义是:一旦一个线程执行synchronized (lock){…}代码块,则“锁住”lock 对象,其他针对lock 对象上锁的synchronized (lock){…}代码块将不允许被执行,直到之前运行的代码块运行结束,释放lock 对象锁后其他代码块才允许执行。




【异常】Claude Code 400错误(Extra inputs are not permitted)解决方案 摘要:Claude Code 2.0.37+版本因API请求包含未支持的custom.input_examples参数导致400错误,使核心功能失效。解决方案是降级至稳定版v2.0.32:先卸载当前版本(npm uninstall -g @anthropic-ai/claude-code),再安装指定版本(npm install -g @anthropic-ai/claude-code@2.0.32),最后验证请求是否恢复正常。该问题确认在v2.0.32版本不存在。(148字) 阅读详情

相关推荐

Hi3516CV610 YOLOv8模型转换与部署实战:从源码到板端推理全流程解析

本文详细解析了Hi3516CV610开发板上YOLOv8模型的转换与部署全流程,包括模型转换、量化、编译和部署等关键步骤。通过实战案例和避坑指南,帮助开发者高效实现从PyTorch模型到嵌入式设备的推理优化,适用于智能门禁、视频分析等实时场景。

weixin_30790841的博客 654

多线程实现数据共享

Java支持多个线程同时访问一个对象或者对象的成员变量,使用关键字synchronized可以保证了线程对共享变量访问的可见性和排他性使用cas机制可以控制线程对共享变量写操作的原子性。 运行结果如下: 二,使用静态变量和CAS机制实现,本例直接使用原子操作AtomicInteger 运行结果:...

JavaAndLI的博客 2548

Qt之QSqlTableModel:高效数据库操作与视图绑定的实战指南

本文深入探讨了Qt框架中的QSqlTableModel组件,它作为连接数据库与Qt视图的智能中介,能极大简化数据库的增删改查操作。通过实战代码演示,详细讲解了如何快速构建可编辑的数据表格、理解并设置关键的数据编辑策略(如OnManualSubmit),以及实现数据过滤、排序等高级功能。文章还提供了性能优化、事务处理及常见避坑指南,帮助开发者高效、稳健地开发数据库驱动的桌面应用。

y4z5a6b7的博客 440

多进程和多线程数据共享

多线程之间的数据共享是通过线程共享同一个进程的内存空间来实现的,因此多个线程可以直接访问相同的内存地址,从而实现数据的共享。这使得多线程编程更加方便,因为不需要像多进程那样使用额外的机制进行进程间通信。然而,多线程共享数据也带来了潜在的问题,比如数据竞争和并发访问问题。当多个线程同时访问共享的数据时,可能会导致数据的不一致性或损坏。因此,在进行多线程编程时,需要合理地处理数据共享,避免数据竞争。

www_z_dd的博客 2820

亚马逊SP-API授权实战:从OAuth流程到Refresh Token获取

本文详细解析了亚马逊SP-API授权流程,从OAuth认证到Refresh Token获取的全过程。通过实战经验分享,帮助开发者快速掌握Marketplace Appstore、Website Workflow和自行授权三种方式,解决常见错误如MD5100和MD9999,并提供了安全存储Refresh Token的最佳实践。

weixin_30379531的博客 519

[仿真实战]FDTD Solutions 8.0:从零搭建薄膜光谱分析模型

本文提供了一份基于FDTD Solutions 8.0的薄膜光谱分析模型从零搭建实战指南。通过详细步骤,手把手教你创建玻璃基底与硅薄膜的几何结构、设置仿真区域与边界条件、配置光源与监视器,并最终计算反射率与透射率光谱。内容涵盖参数扫描与优化,旨在帮助用户快速掌握FDTD仿真在纳米光子学与薄膜光学设计中的核心应用。

defi6farmer的博客 502

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

的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间 一些公共变量的传递的复杂度。将数据抽象成一个类,并将对这个数据的操作作为这个类的方法,这么设计可以和容易做到同步,操作方法也封装在外部类,以便实现对数据的各个操作的同步和互斥,作为内部类的各个。对象作为一个类的内部类,共享数据作为这个类的成员变量,每个线程对共享数据的。)解决了可见性和有序性的问题,而锁解决了原子性的问题,理想情。将数据抽象成一个类,并将数据的操作作为这个类的方法。对象作为一个类的内部类。

2301_78008478的博客 786

发票OFD格式转换成PDF

发票OFD格式转换成PDF

Be_insighted的博客 934

Java多线程之共享资源和同步

Java共享资源和同步

fggdgh的博客 1226

ThinkPad T14 Gen 2与T14P系列对比

表格您的需求推荐机型日常办公、出差、文档处理、视频会议✅(够用、轻便、便宜)视频剪辑、3D建模、编程编译、AI训练、高色准设计✅(性能强、屏幕好、扩展佳)想要未来 5 年不换机✅T14p预算低于 5000 元✅T14 Gen 2(或考虑 T14 Gen 3/4)T14p 2025 款 ≠ 小改款,而是架构级升级它从“高性能笔记本”进化为“AI 移动工作站”,核心差异在于NPU + Ultra 平台 + 全面屏显 + 超长续航。如果您从事AI 开发、视频创作、工程仿真、多任务编程。

tecoes的博客 2749

一文搞懂电流、电压的有效值 RMS

交流电有正半周、负半周,直接平均可能抵消成 0,但负半周一样会发热。这个交流电如果换成直流电,能产生同样发热功率时,对应的直流电压或电流”,电容耐压通常不能按 220V 选,常见会选 400V 或更高余量。所以做硬件时,220VAC 整流滤波后电容上会接近。电压/电流的有效值,也叫。如果它加在电阻上,发热按。

qq_52293640的博客 452

C++并发编程 -2.线程间共享数据

本章就以在C++中进行安全的数据共享为主题。避免上述及其他潜在问题的发生的同时,将共享数据的优势发挥到最大。

qq_45604814的博客 2003

知识图谱:综述

第一种理解:知识图谱本质上是语义网络。本体论是语义网络中最重要的一个要素。第二种理解:知识图谱也叫做多关系图,由多种类型的节点和多种类型的边组成。课程以第二种理解为主。

u013250861的博客 479

C#多线程共享数据

在多线程编程中,我们经常要使用数据共享.C#中是如何实现的呢?很简单,只要把你要共享的数据设置成静态的就可以了.关键字static .如下: static Queue q1=new Queue(); static int b=0; 在这里我定义了一个整形变量b和队列q1. 接下去就可以创建多线程代码了.如下: MyThread myc; Thread[] myt; myt=new Thr...

aome1470的博客 1092

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Java 中如何在两个线程间共享数据?深入解析多线程数据共享方式

在多线程编程中,实现多个线程间的数据共享是非常普遍的需求。例如,一个线程负责生产数据,另一个线程负责消费数据,或者多个线程共同操作某个共享变量。合理地实现线程间的数据共享是并发编程中的一项挑战。本文将探讨 Java 中如何在两个线程之间实现数据共享,以及确保数据一致性和避免数据竞争的方法。

lssffy的博客 2144

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

多线程共享数据的方式:

转:http://blog.youkuaiyun.com/hejingyuan6/article/details/47053409# 1,如果每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,例如,卖票系统就可以这么做。 2,如果每个线程执行的代码不同,这时候需要用不同的Runnable对象,例如,设计4个线程。其中两个线程每次对j增加1,另外两个线程对...

Janson_Lin 544

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Java多线程(四)——多线程数据隔离与共享

  目录 一、引言 二、数据隔离 三、数据共享 1、传入Runnable赋值成员变量 2、新建外部类添加成员变量(这个是教程3中用到的,我比较常用) 四、总结   一、引言   多线程数据隔离与数据共享是个矛盾体,有些数据需要隔离,比如每个人的银行账户,有些需要共享比如买票的总火车票数量,这个问题导致了这篇文章的出现,抽象出了这两类问题。     二、数据隔离   ...

xcymorningsun的专栏 4920

多线程实现数据不共享与数据共享

数据不共享 要实现多线程数据不共享,让每个线程独立,再调用自己的start( )方法即可。因为Java会为每一个对象创建各自的局部变量和空间,因此要实现数据不共享,只要让每个线程中使用的资源数据不是同一个对象的即可。代码如下(用Runnable接口实现): public class MyRunnable implements Runnable{ private int count=5; ...

weixin_43184215的博客 1526

线程系列03,多线程共享数据,多线程不共享数据

多线程编程,有时希望每个线程的数据相互隔离互不影响,有时却希望线程间能共享数据,并保持同步。本篇体验多线程共享和不共享数据。 □ 多线程不共享数据 对于多线程,CLR到底是怎样为它们分配内存栈空间呢?是"一个萝卜一个坑",每个线程都有自己的栈空间;还是"大树底下好乘凉",所有的线程共享同一个栈空间? 我们让2个线程执行相同的静态方法,用到相同的变量,通过打印变量来求证多线程栈空间的分配情况。 ...

weixin_30609287的博客 247

java多线程怎么共享数据_java基础多线程之共享数据

java基础巩固笔记5-多线程之共享数据 线程范围内共享数据 ThreadLocal类 多线程访问共享数据 几种方式 本文主要总结线程共享数据的相关知识,主要包括两方面:一是某个线程内如何共享数据,保证各个线程的数据不交叉;一是多个线程间如何共享数据,保证数据的一致性。 线程范围内共享数据 自己实现的话,是定义一个Map,线程为键,数据为值,表中的每一项即是为每个线程准备的数...

weixin_39961943的博客 275

78-java 多线程如何共享数据

关键字:如果你希望确保所有线程看到共享变量的最新值,并且不会缓存这个变量的旧值,你可以使用。在Java中,多个线程可以通过共享对象来共享数据。包中的原子变量类提供了一种方式来进行无锁的、线程安全的操作。关键字:当你需要在多个线程之间同步访问共享数据时,可以使用。可以为每个线程提供一个独立的变量副本,从而避免共享数据。包中提供了一些线程安全的集合类,可以用来存储共享数据。实例变量共享:如果多个线程访问同一个对象的实例变量。更广泛的锁定操作,可以更灵活地控制同步。,那么这些线程将共享这些实例变量。

weixin_41775999的博客 1314

多线程数据共享

每个进程都有自己的内存,但如果我们在该进程中使用多线程,线程就可以访问这片特定区域,从而彼此进行交互。为了让多个线程访问同一数据,每个线程都必须持有对该数据的引用(例如一个对象)。注意:这个例子中两个线程并不是“同时”操作数据的 —— 第二个线程在第一个线程结束后才开始执行。这意味着一个线程在写入时,另一个线程可能看到的是“写了一半”的中间值(比如只写了前 32 位)。在并发程序中,一个线程对共享变量的更改,另一个线程。,该线程内部对变量的修改对其他线程是可见的。结果是 2,因为两个线程操作的是同一个。

Hello World! 888

多线程共享数据

一.目标 谈到多线程共享数据,理想情况下我们希望做到“同步”和“互斥”。这是目标我们暂且把它先放到这。 二.分类 多线程共享数据通常的场景有一下两种: 场景一: 卖票,我们都买过火车票。要买火车票我们可以去车站,也可以通过代售点(或网购),但不管有多少种方式火车票的总数是一定的。 场景抽象: 对于卖票系统每个线程的核心执行的代码都相同(就是票数--)。 解决方法: 只需创建一个R...

盘子李的博客 578

多线程共享数据案例

/** * 多线程共享数据(设计四个线程,其中两个线程对J加1,两个线程对J减1) * @author tanfei * @date 2012-02-03 */ public class MultiThreadShareData { private static MyShareData shareData = new MyShareData(); public

工作博客 1946

​多进程和多线程数据共享​

​多进程和多线程数据共享​

weixin_62713188的博客 1150
上一篇: 多线程之——线程的状态
下一篇: 编程面试题之——简答题(持续更新...)
Mus_Li
博客等级 码龄10年 28粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值