java 程序中怎么保证多线程的运行安全?

发布网友

我来回答

6个回答

热心网友

2.1.读一致性

        Java 中针对上述“读不安全”的问题提供了关键字 volatile 来解决问题,被 volatile 修饰的成员变量,在内容发生更改的时候,会通知所有线程去主内存更新最新的值,这样就解决了读不安全的问题,实现了读一致性。

        但是,读一致性是无法解决写一致性的,虽然能够使得每个线程都能及时获取到最新的值,但是1.1中的写一致性问题还是会存在。

        既然如此,Java 为啥还要提供 volatile 关键字呢?这并非多余的存在,在某些场景下只需要读一致性的话,这个关键字就能够满足需求而且性能相对还不错,因为其他的能够保证“读写”都一直的办法,多多少少存在一些牺牲。

2.2.写一致性

        Java 提供了三种方式来保证读写一致性,分别是互斥锁、自旋锁、线程隔离。

2.2.1.互斥锁

互斥锁只是一个锁概念,在其他场景也叫做独占锁、悲观锁等,其实就是一个意思。它是指线程之间是互斥的,某一个线程获取了某个资源的锁,那么其他线程就只能睡眠等待。

在 Java 中互斥锁的实现一般叫做同步线程锁,关键字 synchronized,它锁住的范围是它修饰的作用域,锁住的对象是:当前对象(对象锁)或类的全部对象(类锁)——锁释放前,其他线程必将阻塞,保证锁住范围内的操作是原子性的,而且读取的数据不存在一致性问题。

热心网友

线程的安全性问题体现在:

热心网友

1.使用安全类,比如 Java. util. concurrent 下的类。
2.使用自动锁 synchronized。
3.使用手动锁 Lock。
4.保证一个或者多个操作在CPU执行的过程中不被中断。

热心网友

使用synchronied关键字,可以用于代码块,方法(静态方法,同步锁是当前字节码对象;实例方法,同步锁是实例对象) 使用volatile 关键词

热心网友

1.使用安全类,比如 Java. util. concurrent 下的类。
2.使用自动锁 synchronized。
3.使用手动锁 Lock。

热心网友

Concurrentmap 保证每个调用(例如没有发送的 putif)都是原子操作,于多个线程,但它不保证多个调用也是原子的。在上面实现的 getkeybm 方法中,concurrentmap 方法被多次调用,线程之间必然存在竞争,从而导致不正确的最终结果。现在的目标是,将以下操作序列视为原子操作: “对于每个分隔的单词,调用 getkeybm 方法,取出相应的代码(如果存在) ,如果不存在,将其添加到 keytotal,并给它一个编码,即 keytotal 中的变量数加1。”最直观的方法是块同步: (keytotal) integer = keytotaltotal。如果(value = null){ value = keytotal。; }.总大小() + 1; keytotal。使用法线贴图。如果你使用 java8,concurrent map 有一个类似的方法 computeif sent that works: keytotal。如果没有 computeif (word,k-& gt; keytotal.size () + 1) ; 这确保了原子操作。Computeif abroad 方法使用第二个参数生成一个值,以便在单词 key 不存在的情况下将其放入映射中,这与下面的代码相同,并且它是 atomic: v teifabssent (k key,function & lt; ?超级 k?Extends v & gt; mapping function) : if (map.get (key) = null) v newvalue = mapping function.apply (key) ; if (newvalue!= null)返回 map.putifabsent (key,newvalue) ; }刚好与您的目标一致。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com