多线程技术:
概念:
进程:应用程序在内存中所属空间.
线程:是进程中用于控制程序执行的控制单元,执行路径。
进程中至少有一个线程。
JVM启动时候,至少开启了两个线程,
一个:主线程。
一个:垃圾回收线程。
什么时候使用多线程呢?
当多部分代码需要同时执行的时候,就需要多线程技术。
多线程运行的一个特性:随机性。
那是因为CPU在不断做着切换造成的。
线程的状态:
1,创建。
2,运行。
在运行之前,线程被start开启后,就具备了执行资格,但是不一定有执行权。
这种状态,成为临时阻塞状态。
当真正运行时,这时既有运行资格,又有执行权。
3,冻结
放弃了执行资格,没有执行权。
4,消亡。
多线程要执行的代码都要存储到固定的位置上。
否则执行不到。
主线程要执行的代码存放在main方法中。
自定义线程执行的代码都存在run方法中。
该run方法可以通过两种形式获取。
1,Thread类中。
2,Runnable接口中。
创建线程的两种方式:
1,继承Thread类。
步骤:
1,定义类继承Thread类。
2,覆盖Thread类的run方法,让需要多线程执行的代码存放到run方法中。
3,建立Thread类的子类对象,并调用start方法开启线程.
2,实现Runnable接口。
步骤:
1,定义类实现Runnable接口。
2,覆盖Runnable接口中的run方法,将多线程执行代码存储到run方法中。
3,通过Thread类创建对象,并将Runnable接口的子类对象作为实际参数传递给Thread类构造函数。
因为要让多线程明确要执行的代码所属的对象。
4,调用Thread类的start方法开启线程。
start()方法做了什么事情?
1,开启了线程。
2,让jvm执行了线程的run方法。
这种两种方式有什么区别?
实现Runnable接口避免了单继承局限性。
建议使用第二种实现Runnable接口的方式。
----------------
多线程的安全问题?
当共享数据被多条语句所操作,这些语句被多线程分开执行
(也就是这些语句被一个线程执行了一部分,就有其他线程参与进来)。
会容易导致线程安全问题的产生。
解决方式:
同步。(火车上的卫生间)
同步的好处:
解决了线程安全问题。
同步的原理:
其实就是可能引发安全问题的代码进行封装并加锁。
同步的前提:
1,同步中必须有两个或者两个以上的线程。
2,多个线程需要使用同一个锁。
同步的体现:
1,同步代码块。
2,同步函数。
两者的区别:
同步代码块可以使用任意锁。
同步函数使用的锁是固定的。
非静态同步函数使用的是this锁。
静态同步函数使用的是 类的字节码文件对象 类名.class
一般建议使用同步代码块。
同步的弊端:
1,会降低效率,消耗资源,该消耗可以在允许范围内存在。
2,同步的嵌套容易引发死锁