多线程学习(一)-多线程的基础概念

线程安全:
线程安全是指:当以何种执行方法或何种调度方法去访问某一个类或对象、方法时,这个类始终能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。
进程(Process)
是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

线程
有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
并发(concurrency)
把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。(支持两个或者多个动作(Action)同时存在)
并行(parallelism)
把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。(系统支持两个或者多个动作同时执行)

并发不是并行。并行是让不同的代码片段同时在不同的物理处理器上执行。并行的关键是同时做很多事情,而并发是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。

悲观锁:
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。
乐观锁:
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量。

并发编程的特性:

  1. 原子性:和数据库的事务原子性特征一样,要么全部成功,要么全部失败。(java.util.concurrent.atomic包下实现的就是原子性)
  2. 可见性:对在共享区域的数据,一个线程对其数值进行修改,其他线程可以立刻马上读取到这个最新值(volatile ,切记volatile不可和final一起使用)。
  3. 有序性:导致有序性的原因是编译优化,处理器为了拥有更好的运算效率,会自动优化、排序执行我们写的代码,但会确保执行结果不变。

竞态条件
是指,在多线程的情况下,由于多个线程执行的时序不同,而出现不正确的结果。

死锁产生原因

  1. 交叉死锁:线程A依赖线程B,而线程B又依赖于线程A,此时则会表现出线程A等待线程B的结果,而B又在等待线程A,相互等待的状态。
  2. 内存不足,如果内存不足线程执行的中途导致内存资源不够用,只能等待另外的线程先行释放,彼此相互等待从而导致死锁。
  3. 一问一答式的数据交换。类似于http请求的方式,一个客服端请求,服务器响应数据。但是如果中途因意外数据丢失,导致两者都在等待着彼此。除了方案就加一个timeout。
  4. 数据库锁。因为一些意外导致某一个线程对数据库加锁的动作,没有正常的释放数据库的表锁还是行锁。
  5. 文件锁 一个线程对某个文件操作,中途因为一些条件导致一直占有这个文件资源,锁没有成功释放,此时其他线程又在等待过程,导致了死锁。
  6. 死循环。代码编写的的问题导致死循环,一直占用资源。

死锁的分析工具

  • jstack
  • jconsole
  • jprofile
    如使用jdk自带的jconsole分析工具,直接在命令行输入jconsole即可启动如下图所示:
    在这里插入图片描述
    MESI 协议
    MESI 协议是目前主流的缓存一致性协议。此协议会保证,写操作发生时,线程独占该变量的缓存,CPU 并且会通知其它线程对于该变量所在的缓存段失效。只有在独占操纵完成之后,该线程才能修改此变量。而此时由于其它缓存全部失效,所以就不存在缓存一致性问题。而其它线程的读取操作,需要等写入操作完成,恢复到共享状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值