【Java&操作系统】多线程的同步与异步详解

找工作ing,fighting~

多线程并发问题

多线程并发 :多个线程同时工作
多线程并发会产生很多问题,如丢失修改、不可重复读、脏读、死锁等。
为了协调进程之间的制约关系,引入进程同步互斥概念。
同步 :直接制约关系,协调多个线程的工作次序而等待、传递信息所产生的制约关系,控制。例如访问冲突等。
互斥 :间接制约关系,当一个线程进入临界区使用临界资源时,另一个进程必须等待。空闲让进、忙则等待、有限等待、让权等待。
异步 :A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程仍可以请求,A线程无需等待。

同步最最安全,最保险的。而异步不安全,容易导致死锁,这样一个线程死掉就会导致整个进程崩溃,但没有同步机制的存在,性能会有所提升
线程池 :存放线程

多线程的三个特性
原子性:是一个或者多个操作在 CPU 执行的过程中不被中断的特性。
可见性:当一个线程修改了共享变量后,其他线程能够立即得知这个修改,volatile可以保证可见性。
有序性:是程序按照代码的先后顺序执行,为了性能优化,编译器和处理器会可能进行指令重排序,有时候会改变程序中语句的先后顺序。编译器调整了语句的顺序,在单线程中并没有什么影响,但是在多线程中可能会出现异常。

Java的同步机制

  1. ThreadLocal
  2. synchronized
  3. wait()等待notify()唤醒
  4. volatile():volatile 修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。当成员变量发生变化时,强迫线程将变化值回写到共享内存。不具有原子性。

sleep() vs. wait()
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值