简述并发与并行的区别,并发和并行的区别

【简述并发与并行的区别,并发和并行的区别】如何理解应用Java多线程与并发编程?

简述并发与并行的区别,并发和并行的区别


你好 , 很高兴回答你的问题!下面是Java多线程与并发编程详解整合 , 希望对你有所帮助!一、多线程三大特性多线程有三大特性:原子性、可见性、有序性 。原子性(跟数据库的事务特性中的原子性类似 , 数据库的原子性体现是dml语句执行后需要进行提交):理解:即一个操作或多个操作 , 要么全部执行并且执行的过程中不会被任何因素打断 , 要么都不执行 。
一个很经典的例子就是银行账户转账问题:比如从账户A向账户B转5000元 , 那么必然包括2个操作:从账户A减去5000元 , 往账户B加上5000元 。这2个操作必须要具备原子性才能保证不出现一些意外的问题 。我们操作数据也是如此 , 比如i = i 1;其中就包括 , 读取i的值 , 计算i , 写入i 。这行代码在Java中是不具备原子性的 , 则多线程运行肯定会出问题 , 所以也需要我们使用同步synchronized和lock锁这些东西来确保这个特性了 。
原子性其实就是保证数据一致、线程安全一部分 , 可见性:可见性是与java内存模型息息相关的 。当多个线程访问同一个变量时 , 一个线程修改了这个变量的值 , 其他线程能够立即看得到修改的值 。若两个线程在不同的cpu , 那么线程1改变了i的值还没刷新到主存 , 线程2又使用了i , 那么这个i值肯定还是之前的 , 线程1对变量的修改线程2没有看到 , 这就是可见性问题 。
有序性:理解:程序执行的顺序按照代码的先后顺序执行 。一般来说 , 处理器为了提高程序运行效率 , 可能会对输入代码进行优化 , 它不保证程序中各个语句的执行先后顺序同代码中的顺序一致 , 但是它会保证程序最终执行结果和代码顺序执行的结果是一致的 。二、Java内存模型jvm的内存结构为:堆、栈、方法区 , 不同于java的内存模型 , Java的内存模型是关于多线程相关的 。
理解:共享内存模型指的是Java内存模型(简称JMM) , JMM决定一个线程对共享变量的写入时 , 能对另一个线程可见 。从抽象的角度来看 , JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中(局部变量不会存储在) , 每个线程都有一个私有的本地内存(local memory) , 本地内存中存储了该线程以读/写共享变量的副本 。
本地内存是JMM的一个抽象概念 , 并不真实存在 。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编辑器优化 。总结:什么是Java内存模型:java内存模型简称jmm , 定义了一个线程对另一个线程可见 。共享变量存放在主内存中 , 每个线程都有自己的本地内存 , 当多个线程同时访问一个数据的时候 , 可能本地内存没有及时刷新到主内存 , 所以就会发生线程安全问题 。
三、Volatile关键字Volatile关键字的作用:变量在多个线程之间可见 。Volatile关键字是非原子性的 , 不能保证数据的原子性 , 只是能够把解决立马刷新到主内存中 , 不能解决并发问题 。如果想要保证数据的原子性 , 解决并发问题 , 需要使用并发包里的AutomicInteger原子类 。volatile与synchronized区别:仅靠volatile不能保证线程的安全性(原子性) 。

推荐阅读