Java CompletableFuture线程安全问题 5C

有如下代码,想问下这种情况下会有线程安全问题吗,我回调方法里去赋值this.result1和this.result2,然后在最后去读者两个字段,读和写不是同一线程不用同步吗?

 public void newInit() throws ExecutionException, InterruptedException {
    CompletableFuture cf1 = CompletableFuture.supplyAsync(() -> {
        return 1L;
    }).thenAccept(result -> {
        this.result1 = result;
    });
    CompletableFuture cf2 = CompletableFuture.supplyAsync(() -> {
        return 2L;
    }).thenAccept(result -> {
        this.result2 = result;
    });
    CompletableFuture.allOf(cf1, cf2).get();
        System.out.println(this.result1)
}
0

3个回答

首先因为现在的应用越来越复杂,越来越多模块多系统之间相互依赖,一个操作可能需要使用多个模块或者多个系统提供的多个服务来完成一个功能,如果每个服务顺序的执行,可能需要消耗很多时间,或者前端用户需要得到及时响应,不需要等待所有服务完成便可以返回部分结果,而且现在的计算机处理器性能越来越强大,多核处理器越来越普遍,核心数也越来越多,使用多线程可以更加充分利用硬件的资源,不论是什么原因异步编程应运而生。

0

CompletableFuture.allOf(cf1, cf2).get();
--- 这里已经包装thread1和thread2都执行完了,所以result1都写完了,后面再读就不需要同步了

0

CompletableFuture.allOf(cf1, cf2).get(); // 这一行 是等待异步计算执行结束 ,也就是等待其他线程(在这里就是cf1,cf2的线程)执行结束,返回结果,

也就是说,这一行下面的语句只是在主线程里执行了,

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Java学习笔记:线程安全问题
1、多线程的实现: (1)继承Thread类:主函数中通过创建多个SubThread类对象,并调用其start()方法。SubThread类对象中属性数据独占。(2)实现Runnable接口:主函数中创建一个Runnable接口实现类对象,同时创建多个Thread类对象,并传入接口对象,通过各Thread对象的start()方法进行多线程操作。 Runnable接口实现类对象中属性数据本身已经共享
线程安全问题和java内存模型
什么是线程安全问题 当多个线程共享同一个全局变量,在做写的操作时,可能会发生线程安全问题。// 例子: 售卖火车票,多个窗口(多个线程)都在卖火车票数(共享全局变量)。每个窗口在售卖后都会修改票数(写的操作) 代码: /** * 窗口售卖火车票 */ class Thread03 implements Runnable{ private int count = 100...
Java数据结构线程安全问题
引言: 深入Java编程,不可避免触及到各类数据结构的线程安全与否的问题。 因此,希望能通过此篇博文,总结归纳一下Java各类数据结构线程安全知识。 1. 什么是哈希表 在讨论哈希表之前,我们先大概了解下其他数据结构在新增,查找等基础操作执行性能 数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和...
java线程安全问题1
-
关于java线程安全问题
线程:负责一个进程中的代码执行。线程是进程中的一个执行路径。 线程安全问题出现的根本原因: 1. 存在着两个或者两个以上的线程。 2. 多个线程共享了着一个资源, 而且操作资源的代码有多句。 线程安全问题的解决方案: 1. 使用同步代码块 格式: synchronized(锁对象){ 需要被同步的代码; } 线程的生命周期状态图(线程总共有图
java之线程安全问题---懒汉式
并发问题:解决办法:
5个步骤,教你瞬间明白线程和线程安全
面试的时候,有一家公司的技术总监问了我这样一个问题:你来说说有哪些线程安全的类?我心里一想,这我早都背好了,稀里哗啦说了一大堆。 他又接着问:那你再来说说什么是线程安全?——然后我就GG了。说真的,我们整天说线程安全,但是对于什么是线程安全我们真的了解吗?之前的我真的是了解甚微,那么我们今天就来聊聊这个问题。 在探讨线程安全之前,我们先来聊聊什么是进程。     什么是进程?   电...
Java基础之线程安全问题
线程安全问题存在的原因: 由于一个线程在操作共享数据过程中,为执行完毕的情况下,另外的线程参与进来,导致共享数据存在安全问题。 如何解决线程安全问题: 必须让一个线程操作共享完毕后,其他线程才有机会参与共享数据的操作。 Java是如何实现线程的安全:线程的同步机制。 解决方式两种: 1.同步代码块; synchronized(同步监视器) {      //需要被同步的代码块(即操
java 线程安全问题
rn[code=Java]package com.cfd.drp.client;rnrnimport java.sql.Connection;rnimport java.sql.PreparedStatement;rnimport java.sql.ResultSet;rnimport java.sql.SQLException;rnrnimport com.cfd.drp.utils.Utils;rnrnpublic class ClientManager rnrn StringBuffer sb = new StringBuffer();rn rn rn private static ClientManager manager = new ClientManager(); rn rn private ClientManager() rn public static ClientManager getInstance() rn return manager;rn rn rn public String showTree() rn Connection connection = null;rn sb.delete(0, sb.length());rn try rn connection = Utils.getConnection();rn tree(connection,0,1);rn catch(Exception e) rn e.printStackTrace();rn finally rn Utils.close(connection);rn rn rn return sb.toString();rn rn rn public void tree(Connection connection,int id,int level) throws SQLException rn String sql = "select * from t_client where pid = ?";rn int i= 0;rn PreparedStatement ps = null;rn ResultSet rs = null;rn rn try rn ps = connection.prepareStatement(sql);rn ps.setInt(1, id);rn rs = ps.executeQuery();rn while (rs.next()) rn sb.append(rs.getString("name")+" "+"\n");rn if(rs.getString("is_leaf").equals("N")) rn tree(connection,rs.getInt("id"),level);rn rn rn rn finally rn Utils.slose(rs);rn Utils.close(ps);rn rn rnrn[/code]rnrn这个问题是尚学谈DRP项目中的: rn正常运行的结果应该是: rn所有分销商 rn华北区 rn北京 rn北京市医药股份有限公司 rn东北区 rn吉林省 rn辽宁省 rn黑龙江省 rnrnrn下面是jsp页面的内容,这样也页面的内容和简单 就是把上面的字符串显示出来就是了: rnrnrn[code=HTML]rn<%rn ClientManager manager = ClientManager.getInstance();rn out.print(manager.showTree());rn %>[/code]rnrnrnrn但是当我快速刷新页面的时候却就出现问题了。结果变为了,【只有快速刷新的时候才会出现】 rn所有分销商 rn华北区 rn北京 rn北京市医药股份有限公司 rn东北区 rn吉林省 rn辽宁省 rn黑龙江省 rn所有分销商 rn华北区 rn北京 rn北京市医药股份有限公司 rn东北区 rn吉林省 rn辽宁省 rn黑龙江省 rnrn刷新的速度不一样 字符串重复的次数就不一样 请高手指教!谢谢了
java并发编程线程安全问题
1.线程安全:管理对共享的可变状态的访问。状态----指的是静态变量或实例变量。2.共享:静态变量----类的使用者共享,实例变量----对象使用者共享。--目的:线程间相互交流3.可变:对变量有写的过程,只读当然就是不可变的。4.原子操作:意为&quot;不可被中断的一个或一系列操作&quot; 5.解决线程安全的思路:(对应一场安全的考试的情景)     (1)共享变量只读;----不可变性        ...
Java线程安全问题与同步锁
Java线程安全问题与同步锁一篇博文认识Java多线程大致认识了线程也知道了线程的创建方法。今天再来探讨一下线程的安全与同步锁问题。 场景:模拟三个售票员卖30张票 一、测试继承方式创建线程 1)、线程类package com.hk.java.thread;/** * 继承创建法 * * @author 浪丶荡 * */ public class OneConductor
Java赋值的线程安全问题
A  a = new A(); 这个操作分为三部处理 1.栈里创建a的符号引用 2.堆里创建A对象 3.把a指向A 所以,这个赋值语句不是线程安全的,比如下面的代码 public class A {     private volatile static A a;          public static A getInstance() {         if(a
Java中的线程安全问题
线程安全 线程安全:如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,此时我们就称之为是线程安全的。 我们通过一个案例,演示线程的安全问题: 电影院卖票,使用了A、B、C三个窗口进行卖票,电影票总数为100张 采用线程对象来模拟卖票窗口A、B、C;使用Runnable接口的子类来模拟买的电影票 模拟电影票...
java线程安全问题
一. 线程安全出现的场景 多线程环境下,有共享且可变的变量 二. 线程安全问题要解决的问题 原子性 可见性 有序性 三. 如何解决线程安全问题 同步机制 synchronized Lock CAS对象 volatile 线程封闭 栈封闭 ThreadLocal对象 使用不可变(线程安全)对象(juc包下) ...
java:多线程(线程安全问题)
* 多线程并发操作同一数据时, 就有可能出现线程安全问题 * 使用同步技术可以解决这种问题, 把操作数据的代码进行同步, 不要多个线程一起操作 import javax.swing.plaf.synth.SynthSpinnerUI; public class Demo3_Ticket { public static void main(Strin...
Java单例模式及线程安全问题
单例的目的是为了保证运行时Singleton类只有唯一的一个实例,用于一些较大开销的操作。 饿汉方式(线程安全) /** 饿汉方式(线程安全) **/ private Singleton(){} private static final Singleton singleton = new Singleton(); public Singleton getSingleton(){ r...
java 多线程 线程安全问题
public class Main { /** * 需求:100张票 通过4个窗口卖完 * * * 多线程并发操作同一数据时, 就有可能出现线程安全问题 * 使用同步技术可以解决这种问题, 把操作数据的代码进行同步, 不要多个线程一起操作 */ public static void main(String[] args) { TicketSeller t1 = ...
Java 多线程 线程安全问题
/* 线程安全问题产生发原因: 1 多个线程在操作同一个数据 2 操作共享数据的线程代码有多条 当一个线程在执行操作共享数据的多条代码过程中 其他线程参与了运算 就会导致线程安全问题的产生 */ class Ticket implements Runnable{ private int num=100; public void run(){ while(true){ if(n
Java线程安全问题
http://www.iteye.com/topic/806990
Java 单例线程安全问题
public class A n public final static A INSTANCE = new A();n private A()nnn这个类是不是线程安全的呢?单例能这样写吗?
Java并发编程---线程安全问题
1.线程安全的概念       当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的.       synchronized:可以在任意对象或方法上加锁,而加锁的这段代码称为"互斥区"或"临界区"   #代码示例: package com.thread.safety; /** * 线程安全小例子:多个线程竞争问题 *
Java线程安全问题(sychronized)
经典的火车票问题:rn[code=java]public class ThreadDemo2 rn public static void main(String[] args) rn Ticket t1 = new Ticket();rn Ticket t2 = new Ticket();rn Ticket t3 = new Ticket();rn Ticket t4 = new Ticket();rn t1.start();rn t2.start();rn t3.start();rn t4.start();rn rnrnrnclass Ticket extends Thread rn private int ticket;rn Object obj = new Object();rn public void run() rn while(true) rn synchronized (obj) rn if (ticket < 10) rn System.out.println(Thread.currentThread().getName()rn + "--->" + ticket);rn ticket++;rn rn rn rn rn[/code]rn如果我把Ticket类中的ticket变量定义成static,就是这样private static int ticket;也不会有错啊。rn为什么一定要用同步呢?
理解 CompletableFuture 的任务与回调函数的线程
继续对 CompletableFuture 的学习,本然依然不对它的众多方法的介绍,其实也不容易通过一篇述说完所有 CompletableFuture 的操作。此处重点了解下 CompletableFuture 几类操作时所使用的线程,CompletableFuture 的方法重点在它的静态方法以及实现自 CompletionStage 接口的方法,如果是意图异步化编程,反而自我标榜的 Fut
CompletableFuture执行线程的一次研究
在研究vertx线程模型的时候我开始注意到在vertx内部提供给开发者的多数异步api中用到了CompletableFuture或者Promise或者Future。以前也用过CompletableFuture和Futrue等,但当时没有想过它执行时的线程情况,于是写了个测试类用于了解它: public class VertxTest { Logger logger = LoggerFacto
线程安全问题
1.  class Out extends Thread { String name; static int num =50; public Out(String name) { this.name = name; // super(name); } public void run() { while(num>0) { System.out.println(na
线程安全问题?
public static StringBuilder getFullMsg(byte buffer[], int len, InputStream is)rn throws Exceptionrn rn StringBuilder msg = new StringBuilder();rn int i = 0;rn for(i = is.read(buffer); i > -1; i = is.read(buffer))rn rn String str = new String(buffer, 0, i);rn msg.append(str);rn if(msg.toString().getBytes().length == len)rn break;rn buffer = new byte[len - i];rn rnrn return msg;rn rn这个静态方法在多线程中调用会产生线程安全问题吗?
Java线程安全问题及线程安全解决方法
Java线程安全问题一直是一个热议的话题,笔者在开发或面试过程中常遇到类似这样的问题 下面我来总结一下: 线程安全的原因 :线程安全是由于多个线程在数据共享过程中出现了异常,比如一个线程还未执行完成,另一个线程就参与了进来,导致共享的数据不准确。那么我们如何来解决线程安全问题呢?方法有多种 笔者就先列举一种方法叫"安全代码块"关键代码synchronized 具体例子如下: 1.cla
线程(集合的线程安全问题)
集合与线程安全 iterator CAS算法 集合与线程安全 Do you notice that all the basic collection classes - ArrayList, LinkedList, HashMap, HashSet, TreeMap, TreeSet, etc - all are not synchronized? In fact, all...
java进程、线程、多线程以及线程安全问题
进程:进程是处在运行的程序 线程:进程里任务的执行路径 多线程:一个进程里有多个线程可以执行多个任务
Java学习笔记之线程(三):线程的安全问题和解决办法
package com.demo; import org.junit.Test; /* * 线程安全问题的提出: * 用三个线程模拟三个窗口同时售卖50张票。 * * 情况一:票数变量没有被static修饰,结果每个窗口都卖了50张票。 * 原因:非静态的成员变量在每个对象中都会维护一份数据,所以三个线程对象就会有三份; * * 情况二:票数变量用static修饰,变成公
java线程安全问题之volatile 变量
Java 理论与实践: 正确使用 Volatile 变量:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
Java单例模式(饿汉式)的线程安全问题
如果对某个业务类Service 采用了单例模式(饿汉式),那么其他类通过getInstance()获得的实例去访问该service 的方法,是否存在线程安全问题?代码如下rnpublic class UrlService rnrn rn private static UrlService instance = new UrlService();rnrn private UrlService() rn rnrn public static UrlService getInstance() rn return instance;rn rnrn public void addUrl(HttpServletRequest request) rn Stack urlStack = (Stack) request.getSession().getAttribute("stack");rnrn urlStack.push(url);rn request.getSession().setAttribute("stack", urlStack);rn rn rnrn public String getUrl(HttpServletRequest request) rn Stack urlStack = (Stack) request.getSession().getAttribute("url");rn String url = urlStack.pop();rn request.getSession().setAttribute("stack", urlStack);rn return url;rn rn rn rn 多个线程访问addUrl和getUrl时是否是线程安全的?rn
(java)多线程(二)线程安全问题
【线程安全】    线程安全 -- 如果有多个线程同时运行,程序每次运行的结果和单线程运行的结果一样,且其他变量的值也和预期的一样。    线程安全产生都是全局变量、静态变量引起的。若每个线程对对全局变量、静态变量只有读操作,而无写操作,一般来说这个全局变量是线程安全的;若有多个线程同时执行写操作,一般需考虑线程同步,否则就有可能影响线程安全。    线程同步机制能够解决上述线程安全问题  ...
java多线程高并发线程安全问题
在抢购之类的业务处理时,会出现超发之类的线程安全问题。我个人想到的解决方法如下:采用数据库锁,悲观锁有效率低下问题,所以我推荐乐观锁,虽然会增大CPU开销,很多服务和软件都支持乐观锁,如Redis的watch采用FIFO队列,强行把多线程变成单线程,但是也会出现队列内存爆满问题采用同步代码块,只给数据库操作的代码加锁,提高效率,对不同数据记录操作采用不同的锁...
Java并发编程--线程安全问题与解决方案
本文简介: 用多线程开发的人都知道,在多线程的开发过程中有可能会出现线程安全问题(专业术语叫内存可见性问题),但并不一定每次都会出现。出现这样的情况,也会另开发者头皮发麻,无从下手,接下来我们会慢慢深入,揭开多线程的神秘面纱。 本文主要介绍了Java多线程开发的优势,使用该技术可能会出现的一些内存不可见问题以及相应的解决措施。通过本文,读者将学习到如下几块知识: 为什么需要多线程技术(多线...
Java 线程安全问题及线程锁(读书笔记)
首先整理多线程同步的知识点,开头肯定是要先探讨探讨多线程同步的问题。那么嘛叫线程安全问题呢? 答: 我们知道Jvm虚拟机的设计中线程的执行是抢占式的,线程的执行时间是由底层系统决定的。所以就会有多个线程访问同一个数据时的不同步问题。这个就是多线程安全问题。
Java传统的时间格式化的线程安全问题
以下代码会报错: package com.expgiga.Java8; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.*; /** * 测试传统时间格式化的线程
JavaWeb开发之Servlet线程安全问题
Java Web,是用Java技术来解决相关web互联网领域的技术总和,是学习JavaEE的基础以及学习Android服务端开发基础。Java在服务器端的应用非常的丰富,比如Servlet,JSP和第三方框架等等。Java技术对Web领域的发展注入了强大的动力。