JavaSE-多线程(3)- volatile

JavaSE——多线程编程 数据不同步问题解决 测试类中,有一个静态成员a,定义2000个子线程,分别执行对静态变量a的++操作,然后在主线程中输出累加后的a值 MyRunnable: public class MyRunnable implements Runnable{ Object lock = new Object(); @Override public void run() { synchronized (lock) { MyTest.a++; .. 阅读详情

JavaSE-多线程(3)- volatile

volatile 解释

volatile 字面意思为 易变的,解释具体作用前可先看下以下例子:
VolatileTest类中有一个running 变量控制run方法执行,t1 线程启动后 run 方法一直执行,主线程在等待2秒后改变running 值,试图让 t1 线程结束运行,但通过运行结果发现效果并没有达到

例1)

package com.hs.example.base.multithread.day01;

public class VolatileTest {

    private /*volatile*/ boolean running = true;

    public void run(){
        System.out.println("start...");
        while (running){
        }
        System.out.println("end...");
    }

    public static void main(String[] args) {
        VolatileTest volatileTest = new VolatileTest();
        Thread t1 = new Thread(volatileTest::run);
        t1.start();
        /*new Thread(new Runnable() {
            @Override
            public void run() {
                volatileTest.run();
            }
        }).start();*/
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        volatileTest.running = false;
    }
}


但是如果在变量running 前加上 volatile关键字,情况就会和预期的一样,通过在主线程改变running值,t1 线程可以停止运行

为什么出现以上情况

VolatileTest对象实例存放于堆内存中,而 main 和 t1 线程有自己的工作空间,他们访问的 running 变量实际是存放于自己工作空间的副本,当main线程改变自己工作空间 running 变量的值时,堆内存无法及时更新,t1 线程无法拿到最新的 running 值,所以导致线程一直运行。

例2)

下例是一个“懒汉式”的单例模式

package com.hs.example.base.multithread.day01;

public class VolatileTest2 {

    private static /*volatile*/ VolatileTest2 instance = null;

    private int a = 4;

    private VolatileTest2() {
    }

    public static VolatileTest2 getInstance() {
        //双重空值检查
        //步骤 1  当instance实例化后可过滤大部分情况,直接返回实例
        if (instance == null) {
            //步骤 2
            synchronized (VolatileTest2.class) {
                /**
                 * 步骤 3  第二次空值判断,
                 * 假设两个线程 t1 , t2 同时到达步骤1,两者都判断实例为空,那么t1 获得锁后实例化了一个对象,等到t2 获得锁后又会实例化一个对象
                 * 在这里再加一层判断后,t1实例化对象,t2 获得锁,再判断一次,就不会再实例化了
                 */
                if (instance == null) {
                    instance = new VolatileTest2();
                }
            }
        }
        return instance;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                System.out.println(VolatileTest2.getInstance());
            }).start();
        }
    }
}

上面例子看似没什么问题,但是可能存在多线程访问时,VolatileTest2 实例属性值不一致问题,究其原因可以了解下对象创建过程。

对象创建过程:

  • ①给对象分配内存
  • ②给对象属性赋默认值(以上a的默认值为0)
  • ③给对象属性赋初始值(a = 4)
  • ④将对象赋值给引用 instance

假设对象创建时,还没有赋初始值就将对象赋值给了引用,那么这时候 instance 拿到的变量值就不是正确的(此时对象初始化还没完成),如果此时有线程进入,判断 instance 不为空,那么使用的 instance 属性值就是有误的,使用 volatile 关键字可以避免这种情况发生

volatile 作用
  • 保证线程可见性 (例1)
  • 防止指令重排序 (例2)
volatile 为什么能保证线程可见性

当写一个volatile变量时,JMM会把该线程对应的工作内存中的共享变量值刷新到主内存中,当读取一个volatile变量时,JMM会把该线程对应的工作内存置为无效,那么该线程将只能从主内存中重新读取共享变量,其内存语义实现则是通过内存屏障。

内存屏障有两个指令: Load Barrier(读屏障),Store Barrier(写屏障)

内存屏障的作用:

  • 阻止屏障两侧的指令重排序:(后面不往屏障前重排,前面不往屏障后重排)
  • 强制把写缓冲区、高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效。
  • 对于 Load Barrier 来说,在指令前插入 Load Barrier,强制重新从主内存加载数据,可以让高速缓存中的数据失效(不去读缓存中的数据,而是去主内存中重新加载)
  • 对于 Store Barrier 来说,在指令后插入 Store Barrier, 能让写入缓存中的最新数据更新写入主内存,让其他线程可见。

四种内存屏障:

LoadLoad屏障:禁止读和读的重排序
StoreStore屏障:禁止写和谐的重排序
LoadStore屏障:禁止读和写的重排序
StoreLoad屏障:禁止写和读的重排序

可以通过以下文章了解详细内容:

https://baijiahao.baidu.com/s?id=1709086005694976168&wfr=spider&for=pc

https://blog.youkuaiyun.com/weixin_43093006/article/details/111351514

Oracle登录报错ORA-12560?5分钟搞定TNS协议适配器错误的完整修复指南 本文详细解析了Oracle登录报错ORA-12560(TNS协议适配器错误)的成因与解决方案。从基础服务检查到高级网络配置排查,提供了一套完整的修复流程,帮助数据库管理员快速解决连接问题,确保Oracle数据库的稳定运行。 阅读详情

相关推荐

Mac用户必看:Parallels Desktop 18.1.1最新破解版安装与优化全攻略(附资源)

本文为Mac用户提供Parallels Desktop 18.1.1的详细安装与优化指南,涵盖虚拟化技术选型、专业级配置流程及性能调优技巧。重点解析Parallels Desktop在图形加速、系统资源调度方面的核心优势,并分享生产力增强技巧与典型应用场景实战方案,帮助用户最大化利用这一高效虚拟化工具。

weixin_29240343的博客 825

java线程volatile_Java:多线程中的volatile

一、为什么使用volatile首先,通过一段简单的代码来理解为什么要使用volatile:1 public class RunThread extendsThread{2 private boolean isRunning = true;3 public booleanisRunning(){4 returnisRunning;5 }67 public vo...

weixin_42665725的博客 280

Java 关键字 volatile 的作用(1/2):保证线程的可见性

volatile 保证线程可见性 先贴上代码 变量 running 前面不加 volatile 修饰时: package test; import java.util.concurrent.TimeUnit; public class T01_HelloVolatile { boolean running = true; void m() { System.out.println("m start"); while (running) {

XPiedPiperX的博客 521

惊爆揭秘!异步启动永磁同步电机,调速核心技术大起底

传统的同步启动方式需要额外的同步设备,成本高且维护复杂。异步启动PMSM则巧妙地利用了鼠笼感应电机的启动原理,无需额外同步设备即可实现安全可靠的启动。其核心思想是将定子电流分解为两个正交的分量:磁链分量(id)和转矩分量(iq),分别控制这两个分量,从而实现对电机转矩的精确控制。随着电机设计技术的不断进步和控制算法的不断优化,异步启动PMSM的性能将得到进一步提升,应用范围也将更加广泛。异步启动PMSM的调速技术是其核心技术之一,直接影响着电机的性能和应用范围。

wen8789的博客 984

find命令

命令是 Linux/Unix 系统中用于搜索文件和目录的强大工具,支持多种搜索条件组合,并能对搜索结果执行各种操作。以下是其详细说明、常用参数及示例: 搜索路径:指定起始目录(如 、 或 表示当前目录)。 查找条件:基于文件名、类型、大小、时间等属性过滤。 处理动作:对匹配结果执行操作(如打印、删除、执行命令等)。 常用参数及示例 1. 按名称查找 :区分大小写匹配文件名。 :不区分大小写匹配文件名。 2. 按文件类型查找 :指定文件类型。 文件类型: :普通文件 :目录 :符号链接

qiao2458的博客 1137

Java多线程详解(五)------ volatile

volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。 public class RunThread implements Runnable { private boolean isRunning = true; public void setRunning(boolean isRunning) { this.isRunning = isRunning; } @Override public void

naruto227的博客 270

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

100天精通Python(进阶篇)——第43天:批量将PDF转Word文档(附上脚本代码)

努力让自己发光,对的人才能迎着光而来 9万+

JAVA多线程-(四)并发编程三大特性之可见性volatile

并发编程三大特性 可见性 volatile 修饰变量 /** * volatile 关键字,使一个变量在多个线程间可见 * A B线程都用到一个变量,java默认是A线程中保留一份copy,这样如果B线程修改了该变量,则A线程未必知道 * 使用volatile关键字,会让所有线程都会读到变量的修改值 * <p> * 在下面的代码中,running是存在于堆内存的t对象中 * 当线程t1开始运行的时候,会把running值从内存中读到t1线程的工作区,在运行过程中直接使用这个copy,

qq_37200262的博客 611

【Flutter 问题系列第 16 篇】如何防止软键盘弹出后顶掉内容

Flutter 如何防止软键盘弹出后顶掉内容

“Allen Su”的博客 3317

SolidWorks 小车底盘 装配体

通过制作小车底盘了解solidworks装配体的部分知识

及时总结 2229

JMM内存模型底层原理分析

概述:JMM(Java Memory Model)Java内存模型,是java虚拟机规范中所定义的一种内存模型。 Java内存模型(Java Memory Model)描述了Java程序中各种变量(线程共享变量)的访问规则,以及在JVM中将变量存储到内存和从内存中读取变量这样的底层细节。 所有的共享变量都存储于主内存。这里所说的变量指的是实例变量和类变量。不包含局部变量,因为局部变量是线程私有的,...

baidu_39603432的博客 320

MIKE 21 教程 1.5 基于卫星影像绘制河道边界

上一节讲解了如何输入高程数据与绘制网格本节讲解如何根据卫星影像绘制河道边界。在实际项目中,经常遇到河道图纸缺少的情况,此时可以根据卫星影像进行勾勒绘制。常用的地理信息软件均可完成此功能,这里使用大家较为熟悉的ArcGis进行教学(本文默认大家有基础ArcGis操作知识,如有不懂可留言)。

Hello Word 3282

【JavaSE】【多线程】volatile,wait/notify

volatile处理内存可见性问题 wait / notify调控线程调度

yj20040627的博客 3508

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

javase - 多线程之volatile

  目录 特性(一):实时可见性 特性(二):禁止指令重排序  volatile :英文的字面意思是易变的、不稳定的。 特性(一):实时可见性 (什么意思?一个线程对属性进行写操作,通知其他线程。告诉他们,这个属性已经发生了改变。) 通过一个demo讲解下。如下: package com.test.testDemo3; import com.test.testThread....

The Secret 262

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JavaSE 详解volatile关键字

volatile特性(1)内存可见性:通俗来说就是,线程A对一个volatile变量的修改,对于其它线程来说是可见的,即线程每次获取volatile变量的值都是最新的。(2)有序性:禁止进行指令重排序。如何保证内存可见性?在java虚拟机的内存模型中,有主内存和工作内存的概念,Java内存模型规定了所有的变量都存储在主内存中。每条线程中还有自己的工作内存,线程的工作内存中保存了被该线程所使用到的变量

JavaLab 941

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java多线程-volatile关键字

文章目录volatile关键字一 简介二 volatile关键字的可见性三 volatile关键字能保证原子性吗?四 synchronized关键字和volatile关键字比较 volatile关键字 一 简介 Java中的“volatile关键字”: 在 JDK1.2 之前,Java的内存模型实现总是从主存(即共享内存)读取变量,是不需要进行特别的注意的。而在当前的 Java 内存模型下,线程可...

qq_24095055的博客 1290

【JavaSE】【多线程】单例模式

单例模式中的饿汉模式和懒汉模式

yj20040627的博客 4137

[JavaSE] 多线程

CPU的指令有两种:精简指令集:一条指令包含较少的操作,基本上一个指令对应一个时钟周期。复杂指令集:一条指令包含很多操作,一个指令占用很多时钟周期。CAS全称是Compare and swap,就是CPU中的一个原子操作,具体执行的内容是:存在一个内存地址V,一个寄存器A,一个寄存器B,此时从V中读取数据,判断该数据跟A中的值是否一样,一样的话就会交换V和B中的值。

2402_83046353的博客 1185

JavaSE多线程之线程池和定时器

JavaSE多线程之线程池和计时器 1.线程间的等待唤醒机制 Object 类中 void wait () 在其他线程调用此对象的 notify () 方法或 notifyAll () 方法前,导致当前线程等待。 void wait (long timeout) 在其他线程调用此对象的 notify () 方法或 notifyAll () 方法,或者超过指定的时间量前,导致当前线程等待。 void notify () 唤醒在此对象监视器上等待的单个线程。 void notifyAll () 唤醒在此

ITzhazhassc的博客 235

你真的会用volatile吗

文章目录volatile的概念volatile详解什么时候需要使用volatilevolatile在标准库里的应用volatile会降低程序执行的效率volatile不是万能的 volatile的概念 或者说,volatile解决什么问题? 我自己的总结:volatile解决多线程下变量访问的内存可见性问题,用于线程间通信。 通信怎能理解呢,线程A写一个volatile变量,随后线程B读这个vol...

lucasma的博客 1956

【JAVA多线程】volatile关键字在JAVA多线程编程中的作用

http://www.cnblogs.com/dolphin0520/p/3920373.html     看完这位大神的分析,依然有一些问题。 Section1 问题     多线程编程时,要想保证安全,必须满足三个条件。     首先复习一下作者提出的三个概念: 1. 原子操作     oracle 官方文档对atomic access 的定义:     In program

charliestark的博客 361

【JAVASE】volatile关键字

结果:我们看到,VolatileThread线程中已经将flag设置为true,但main()方法中始终没有读到,从而没有打印。

Robin的博客 100

【JavaSE】多线程

一、概述 1.1 进程(Process) 一个运行中的程序就是一个进程。进程有以下三个特点: 独立性:进程是系统中独立存在的实体,每一个进程都拥有自己私有的地址空间。没有经过允许,不可以直接访问其他线程的地址空间。 动态性:进程具有自己的生命周期和各种不同的状态。 并发性:多个进程可以在单个处理器上并发执行,之间不会互相影响。 并发性:指在同一时刻,有多条指令在多个处理器上同时执行。 并行性:指同一时刻只能有一条指令执行,多个指令轮换执行。 1.2 线程(Thread) 线程也被称为轻量级进程,线程

苹果不肖皮的博客 315

JavaSE(多线程、高并发及线程安全、volatile关键字、原子类、synchronized关键字、并发包)

JavaSE阶段多线程并发与并行 多线程 并发与并行

weixin_50648720的博客 1076

javaSE之多线程

现代计算机绝大部分都有多核处理器,使得程序可以并发的执行多个任务。在Java中,使用多线程编程,可以使得程序运行速度更快。

qq_51523399的博客 273
上一篇: JavaSE-多线程(2)- 锁
下一篇: JavaSE-多线程(4)- CAS
sql2008help
博客等级 码龄11年 80粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值