j***a语言线程解释,j***a线程理解

kodinid 11 0

大家好,今天小编关注到一个比较意思的话题,就是关于java语言线程解释的,于是小编就整理了3个相关介绍Java语言线程解释的解答,让我们一起看看吧。

  1. Java:关于多线程与多核,如何将多核都利用上呢?
  2. python中的多线程和JAVA中的多线程有什么区别吗?
  3. 多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?

JAVA:关于多线程与多核,如何将多核都利用上呢?

自己写个多线程的程序跑起来,把任务管理打开,打开“性能选项卡,观察你就发现了,其实不管你你的是4核,8核,***核,基本都是在一个格子里有动作的,跟理论上几个线程就在几个核里跑不一致的,操作系统自身的设计导致的。核虽然多,县城虽然多,但是还没有真正设计成几个线程就在几个核里跑的算法模式。至于怎么都利用上不是你说了算,os说了算。别想太多。

python中的多线程和J***A中的多线程有什么区别吗?

Python支持多线程的,但是python里的多线程是单cpu意义上的多线程,它和多cpu上的多线程有着本质的区别,这是因为python存在一个叫Global interpreter Lock(GIL)全局解释器

java语言线程解释,java线程理解-第1张图片-安济编程网
图片来源网络,侵删)

在解释器解释执行任何 Python 代码时,都需要先获得这把锁,也就是说在同一时刻内,只有一条线程可以在CPU中运行

但是python的多线程并不是毫无用处的。当遇到 I/O 操作时会释放这把GIL锁,所以如果程序是一个IO密集型的程序,一个线程处在IO等待的时候另一个线程便可以取得锁并在CPU中运行,这时就发挥了多线程的作用。

但如果是纯计算的程序,没有 I/O 操作,那么只有取得GIL锁的线程可以在CPU中运行,其它的线程都处于等待状态,等待持有GIL 锁的线程的释放锁,也就相当于单线程在跑(而且上下文切换也会有所开销)。

java语言线程解释,java线程理解-第2张图片-安济编程网
(图片来源网络,侵删)

J***a 方面,其提供并发机制:一个进程中可以并发多个线程,每条线程并行执行不同的任务。因为线程运行于多核CPU上,各线程可分布于CPU的各个核心,所以可以让程序实现真正的并发。

以上就是python和j***a多线程的区别,希望我的回答对你有所帮助。

多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?

原则上要加锁。个别简单场景可以不加,比如可以确定读写不会冲突,或者单个简单变量考虑volatile。如果是大项目且性能优化指标不是纳秒级的,建议加上锁,免得埋坑。

java语言线程解释,java线程理解-第3张图片-安济编程网
(图片来源网络,侵删)

先说结论:不必要

  • 如果不需要可见性,什么都不需要加
  • 如果需要保证可见性,则需要加volatile关键字。这里可以加锁,但是没必要,对性能有影响

下面简单解释下原因:

加锁是因为操作不是原子性的,以i++这个操作来解释,看下面两张图。

i++这个操作需要

看上面第二张图,能很清楚的理解流程吧?

加锁就是保证上面的三步是一个原子操作。

回到问题,这里只有一个线程写,实际没有竞争,所以没必要加锁。

但是,看第一张图,因为有主内存和本地内存的存在

  • 线程先写入本地内存
  • 然后刷入主内存
  • 其它内存同步主内存到工作内存
  • 然后从工作内存中读取

一个线程写入后,不能保证其它线程立即看到,这就是可见性问题。

加了volatile关键字后,会强制操作后同步工作内存和主内存,保证其它线程立刻看到。

看你用什么语言开发的,如果是c/C++,***设读写int, int内存里是4Byte,则有可能

写线程写到2byte,就有一个读线程读取数据了,则是就是脏数据了。

一些高级语言,对变量操作基本是原子操作,基本是原子操作。

要加锁!我们需要保证的是该变量在多线程环境下是线程安全的。

典型的read write lock场景,J***a中比较经典的ReentrantReadWriteLock。

另外多说一句,当你不确定要不要加锁的时候,就是你需要加锁的时候。

然后你参考MySQL数据库下Innodb存储引擎默认级别是RR,防止脏读,即当我们update一条数据的时候,是加了行锁的,其他的读线程在等待着,所以你需不需要加锁?

不加锁会出现什么问题?

显然会出现脏读的问题!

这也是面试中常见的一种问题,以该题为突破口,带你进入多线程的世界

其实加锁也很简单,J***a中对该变量进行volatile修饰即可!

了解volatile的同学需要学习了,本质上是为了保证变量操作时候的内存可见性

那怎么保证内存可见性呢?禁止指令排序、内存屏障。

到此,以上就是小编对于j***a语言线程解释的问题就介绍到这了,希望介绍关于j***a语言线程解释的3点解答对大家有用。

标签: 线程 多线 内存

上一个python人脸识别库学习,

下一个linux命令学习创建文件,linux命令 创建文件