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

 我来答
羊羊0531
2021-10-27 · 超过37用户采纳过TA的回答
知道小有建树答主
回答量:128
采纳率:0%
帮助的人:7.3万
展开全部

2.1.读一致性

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

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

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

2.2.写一致性

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

2.2.1.互斥锁

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

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

  • 对象锁:当它修饰方法、代码块时,将会锁住当前对象

  • 类锁:修饰类、静态方法时,则是锁住类的所有对象

  • 注意: 锁住的永远是对象,锁住的范围永远是 synchronized 关键字后面的花括号划定的代码域。

    2.2.2.自旋锁

    自旋锁也只是一个锁概念,在其他场景也叫做乐观锁等。

    自旋锁本质上是不加锁,而是通过对比旧数据来决定是否更新:

匿名用户
2021-10-22
展开全部

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

  • 原子性:一个或者多个操作在 CPU 执行的过程中不被中断的特性

  • 可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到

  • 有序性:程序执行的顺序按照代码的先后顺序执行

  • 导致原因:

  • 缓存导致的可见性问题

  • 线程切换带来的原子性问题

  • 编译优化带来的有序性问题

  • 解决办法:

  • JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题

  • synchronized、volatile、LOCK,可以解决可见性问题

  • Happens-Before 规则可以解决有序性问题

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
圈内早知道

2021-10-22 · 专注为您呈现不一样的圈内事。感谢关注
圈内早知道
采纳数:757 获赞数:1290

向TA提问 私信TA
展开全部
1.使用安全类,比如 Java. util. concurrent 下的类。
2.使用自动锁 synchronized。
3.使用手动锁 Lock。
4.保证一个或者多个操作在CPU执行的过程中不被中断。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
念兴思eY
2021-10-22 · 贡献了超过761个回答
知道答主
回答量:761
采纳率:0%
帮助的人:29.9万
展开全部
使用synchronied关键字,可以用于代码块,方法(静态方法,同步锁是当前字节码对象;实例方法,同步锁是实例对象) 使用volatile 关键词
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
河南新华电脑学院
2021-10-22 · 百度认证:河南新华电脑学院有限公司官方账号
河南新华电脑学院
河南新华电脑学院隶属于IT教育知名品牌——新华互联网科技,是具有一定影响力的直营电脑教育品牌。
向TA提问
展开全部
1.使用安全类,比如 Java. util. concurrent 下的类。
2.使用自动锁 synchronized。
3.使用手动锁 Lock。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 3条折叠回答
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式