多线程的基础学习

进程:是一个正在执行中的程序,

每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。

线程:是进程中的一个独立的控制单元,

线程在控制中进程的执行。

提高效率,各自相互运行!(各线程运行的机会是平等的)

一个进程中至少有一个线程。

运行状态:cup只能执行一个线程(不断的切换线程,没有运行的,就处于临时状态,等待运行——————各线程运行的机会是平等的)

临时(阻塞)状态:具备运算资格,但是没有执行权(临时状态过了以后就到了 运行状态start())

冻结状态:放弃了执行资格

(睡眠状态sleep(time)时间到了后就到了到了 临时状态 或者 等待状态wait(),notify()等待被唤醒到了  临时状态)

消亡状态:stop()或者 run方法结束。线程也就执行完了

多线程的安全问题!!!

问题的原因:

当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完,

另一个线程参与进来执行,导致共享数据的错误。

解决方法:

对多条操作共享数据的语句时,只能让一个线程都执行完,在执行过程中,其他线程不可以参与运行

java对于多线程的安全问题提供了专业的解决方式:就是同步代码块

(同步的前提:

1>必须要有两个或者两个以上的线程

2>必须是多个线程使用同一个锁

同步里面必须保证:只有一个线程在运行

利与弊:解决了多线程安全问题,变得有序了!但是多个线程必须判断锁(也就是监听器判断是否有人),较为消耗的资源

(同步代码块)synchronized(对象)

{

需要同步的代码

}

(同步方法)public synchronized void 方法名(){

需要同步的代码

}

run(){

this.方法名(需要同步的方法名)

}

同步举例:火车的卫生间问题。

1.目的:该程序是否有安全问题,如果有,如何解决?

如何找安全问题:

1>明确哪些代码是多线程运行代码。

2>明确共享数据。

3>明确多线程运行代码中那些语句是操作共享数据的。

2.同步函数用的是哪一个锁呢?

函数需要被对象调用,那么函数都有一个所属对象引用,就是this.

所以同步函数使用的锁就是this(对象一定要一样)

3.如果同步函数被被静态方法修饰后,使用的锁是什么呢?

通过验证,发现不在是this,因为静态方法中也不刻意定义this.

那么是谁?

静态方法进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象。

类名.class  该对象的类型是Class.

静态的同步方法,使用的锁是该方法所在类的字节码文件对象。   类名.class

对于多个生产者和消费者

为什么要定义while判断标记

原因:让被唤醒的线程再一次判断标记。

为什么要定义notify.

因为需要唤醒对象线程

因为只用notify,容易出现只唤醒本方的线程的情况,导致程序中的所有线程都等待。

***********重点

JDK1.5中提供多线程升级解决方案(现实锁机制,锁的操作机制)

将同步Synchronized替换成现实Lock操作

将Object中wait,notify,notifyAll,替换了Condition对象

将对象可以Lock锁 进行获取

该实例中,实现了本方只唤醒对方的操作!

**********

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏令仔很忙

Hibernate从入门到放弃(三)----持久化对象

当对象刚创建,和Session没有发生任何关系时,当程序运行完成就立刻消失,被称为瞬时态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识,如果程序中失...

1141
来自专栏Python绿色通道

Python的进程

Python实现多进程的方式主要有两种:一种方法是使用os模块中的fork方法; 另一种是使用multiprocessing模块。这两种方法的区别在于前者仅适用...

902
来自专栏林冠宏的技术文章

Golang 的 协程调度机制 与 GOMAXPROCS 性能调优

Golang 简称 Go,Go 的协程(goroutine) 和我们常见的线程(Thread)一样,拥有其调度器。

3211
来自专栏地方网络工作室的专栏

Python3 初学实践案例(4)可设定长度和密码复杂级别的生成密码脚本

Python3 初学实践案例(4)可设定长度和密码复杂级别的生成密码脚本 在学习 python 的第一次实战中,我就完成了一个生成密码的脚本。原文链接:http...

21510
来自专栏郭耀华‘s Blog

Python 中的 if __name__ == '__main__' 该如何理解

1083
来自专栏武军超python专栏

2018年8月25日多进程编程总结

今天遇到的新单词: terminal    n终端 terminate  v结束,使终结 basic        adj基本的

1395
来自专栏Petrichor的专栏

AttributeError: 'module' object has no attribute 'fullmatch'.

经过查找,发现出错的原因是 re库 中的 fullmatch函数 是 在py3.4之后才新添加的 。

2413
来自专栏Petrichor的专栏

aptitude指令

aptitude update #更新可用的包列表 aptitude upgrade #升级可用的包 aptitude dist-upgrad...

1243
来自专栏郭耀华‘s Blog

Python 中的 if __name__ == '__main__' 该如何理解

1794
来自专栏菩提树下的杨过

bash/shell编程学习(2)

注:linux中有一个经典名言【一切皆文件】,/dev/null可以认为是一个特殊的空文件,更形象点,可以理解为科幻片中的黑洞,任何信息重向定输出到它后,便有去...

763

扫码关注云+社区