java多线程知识整理

 

java多线程知识整理 本文不是入门篇,仅记录容易出错的知识点

为什么需要多线程

根本原因:

  1. 同一段时间尽量做更多的事;
  2. 充分发挥CPU的功能,避免浪费CPU资源;
  3. 同一时间需要做不同的事;

多线程的核心问题

  1. 对同一个变量的读写,导致脏写(数据库事务概念);

  2. 多个线程相互协作,如何通信,比如线程A依赖线程B的某个资源

如果没有特别的控制和机制,多个线程对同一个变量的读写,容易造成中间结果相互覆盖的情形,

类似于数据库事务中的脏写

有时线程A的执行需要线程B的某个资源,或者等线程B执行完某个操作之后,才能往下执行.

竞态条件

竞态条件,说得通俗一点,就是线程A 需要判断一个变量的状态,然后根据这个变量的状态来执行某个操作。 在执行这个操作之前,这个变量的状态可能会被其他线程修改。

参考:http://hw1287789687.iteye.com/blog/2007134

多线程争抢的是什么资源?

  1. CPU资源;
  2. lock(ownership of this monitor/object's monitor)

获取CPU资源,线程状态 从就绪状态进入运行状态;

获取 lock,则由blocked状态进入就绪(runnable)状态

容易弄混的

  1. 调用完wait()之后,会往下执行吗?
    不会,会做两件事 (1) 释放锁;
    (2)进入等待队列;

  2. 线程A 先调用wait(),线程B 在同步代码块中调用 notifyAll(),线程A会马上执行吗? 不会.官网文档:

The thread releases ownership of this monitor and waits until another thread notifies threads waiting on this object's monitor to wake up either through a call to the notify method or the notifyAll method. The thread then waits until it can re-obtain ownership of the monitor and resumes execution

B线程调用notifyAll() 之后,线程A 从等待队列进入 锁池,等待获取同步锁,并不会马上执行.

  1. 可以任意执行wait()吗?
    不可以,必须先获取锁,才有资格执行wait().

Causes the current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object. In other words, this method behaves exactly as if it simply performs the call wait(0). The current thread must own this object's monitor.

哪些手段保证多线程的安全?

  1. 使用synchronized;
  2. 使用读写锁

总结

java 多线程安全机制和数据库事务的隔离级别 ,是一样的套路,
java中,同一个时间片,只允许一个线程进入同步代码块,来保证安全;
数据库事务中,通过共享读锁,排它锁,行级所,表级锁,来保证对于同一个表或同一行数据,只能有一个事务进入

参考:https://blog.csdn.net/evankaka/article/details/44153709
http://www.importnew.com/26850.html http://www.hollischuang.com/archives/943

 https://my.oschina.net/huangweiindex/blog/1919895

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值