signed

QiShunwang

“诚信为本、客户至上”

java多线程——线程安全

2021/6/3 17:25:34   来源:

目录

  • 概述
  • 同步代码块
  • 总结

概述

  • 什么是线程安全问题
    • 多个线程执行的不确定性引起执行结果的不稳定
    • 多个线程对账本的共享(共享数据),会造成操作的不完整性,会破坏数据
  • 例子:之前卖票的例子,最后可能出现错票,即100张票,票号只可能是100~0,但是最后出现了票号为-1的票。或者出现重票,即有3张票号都为100的票的情况。
    • 原因:当某个线程操作车票的过程中,尚未操作完成,其他线程也参与了进来,也对车票进行操作
      在这里插入图片描述
  • 如何解决:当一个线程a在操作共享数据(ticket)的时候,其他线程不能参与进来。直到线程a操作完共享的数据(ticket),其他线程才可以参与进来,继续操作共享数据(ticket)。这种情况即使在线程a出现了阻塞,也不能改变。
  • 在java中,我们通过同步机制,来解决线程的安全问题
    • 方式一:同步代码块
    • 方式二:同步方法

同步代码块

  • 语法:
synchronized(同步监视器){
	//需要被同步的代码
}
  • 说明:
    • 操作共享数据的代码,即为需要被同步的代码(包含的代码不能多也不能少)
    • 共享数据:多个线程同时操作的数据(例如卖票例子中的ticket)
    • 同步监视器:俗称。任何一个类的的对象,都可以充当为锁
      • 要求多个线程必须要共用同一把锁

总结

  • 使用同步的方式解决线程问题的好处与局限性
    • 好处:同步的方式,解决了线程的安全问题
    • 局限性:操作同步代码块的时候,只能有一个线程参与,其他线程等待。相当于是一个单线程的过程,效率较低。