多线程的基础学习

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

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

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

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

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

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

运行状态: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 条评论
登录 后参与评论

相关文章

来自专栏Spark学习技巧

Java多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应...

3245
来自专栏java一日一条

JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应...

371
来自专栏Golang语言社区

Golang语言社区--【游戏服务器知识】多线程并发

引言:上篇文章说到了多进程并发式的服务端模型,如上一篇文章所述,进程的频繁创建会导致服务器不堪负载,那这一篇博客主要讲述的是线程模型和线程池的方式来提高服务端的...

3074
来自专栏Java帮帮-微信公众号-技术文章全总结

JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应...

4588
来自专栏Java帮帮-微信公众号-技术文章全总结

03.线程安全/同步/线程通讯

03.线程安全/同步/线程通讯 一.一个典型的Java线程安全例子 ? ? 上面例子很容易理解,有一张银行卡,里面有1000的余额,程序模拟你和你老婆同时在取款...

3367
来自专栏Albert陈凯

4.4 共享变量

4.4 共享变量 一般来说,当一个被传递给Spark操作(例如,Map和Reduce)的函数在一个远程集群上运行时,该函数实际上操作的是它用到的所有变量的独立...

32212
来自专栏栗霖积跬步之旅

java多线程编程核心技术——第三章总结

第一节等待/通知机制 1.1不使用等待/通知机制实现线程间的通讯 1.2什么是等待/通知机制 1.3等待/通知机制的实现 1.4方法wait()锁释放与noti...

19910
来自专栏C#

C#创建安全的栈(Stack)存储结构

    在C#中,用于存储的结构较多,如:DataTable,DataSet,List,Dictionary,Stack等结构,各种结构采用的存储的方式存在...

1896
来自专栏java一日一条

JAVA多线程和并发基础面试问答

多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里,从面试的角度列出了大部分重要的问题,但是你仍然应该牢固的掌握Java多线程基础知识来对应...

522
来自专栏JavaQ

Java多线程编程笔记之多线程技能

1.进程和线程的概念及线程的优点 进程是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单位。 线程可以理解成是进程中独立运行的子任务。 线程...

3197

扫码关注云+社区