- 并行:指两个或多个事件在同一时刻点发生;
并发:指两个或多个事件在同一时间段内发生。 - 并发性是指在一段时间内宏观上有多个程序在同时运行
线程也是一样的,JVM线程调度随机性。
-
进程是指一个内存中运行中的应用程序。每个进程都有自己独立的一块内存空间,进程间通信很不方便,一个应用程序可以同时启动多个进程。一个进程至少有一个线程
多进程:操作系统中同时运行的多个程序。
多线程:在同一个进程中同时运行的多个任务。多任务系统,允许多个任务,每一个任务就是一个进程,每一个进程也可以同时执行多个任务,每一个任务就是线程。
进程与线程的区别:
进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少有一个线程。
线程:堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以通信,一个进程中的多个线程是并发运行的。Java程序的进程里至少包含主线程和垃圾回收线程(后台线程)。 -
多线程作为一种多任务、并发的工作方式,优势:
① 进程之前不能共享内存,而线程之间共享内存(堆内存)则很简单。
② 系统创建进程时需要为该进程重新分配系统资源,创建线程则代价小很多,
③ Java语言本身内置多线程功能的支持
多线程是为了同步完成多项任务,不是为了提高程序运行效率,但是却通过提高资源使用效率来提高系统的效率。 -
在Java代码中如何去运行一个进程
方式1:Runtime类的exec方法:
方式2:ProcessBuilder的start方法 -
创建和启动线程,传统有两种方式:
方式1:继承Thread类;
方式2:实现Runnable接口;
----------------------------------------------------------------
线程类: Thread类和Thread的子类才能称之为线程类. 别忘了主线程(main方法,表示主线程). -
方式1:继承Thread类:
注意:如果调用run方法好比是对象调用方法,依然还是只有一个线程(main线程),并没有开启新的线程.
-
方式2:实现Runnable接口;
-
使用匿名内部类来创建线程:
吃苹果比赛
-
继承方式和实现方式的区别:实现方式能共享资源
继承方式: 因为 每个new Person都是一个线程,都有各自的苹果
实现方式: 虽然每个new Thread都是一个线程,他们共享一个new Apple() -
要解决多线程并发访问同一个资源的线程安全性问题:保证线程同步进行(原子操作) -----锁机制
A线程进入操作的时候,B和C线程只能在外等着,A操作结束,A和B和C才有机会进入代码去执行.
方式1:同步代码块
方式2:同步方法
方式3:锁机制(Lock) -
同步代码块:
synchronized(同步锁)
{
需要同步操作的代码
}
同步锁:
为了保证每个线程都能正常执行原子操作,Java引入了线程同步机制.
同步监听对象/同步锁/同步监听器/互斥锁:
一般的,我们把当前并发访问的共同资源作为同步监听对象.同步方法:使用synchronized修饰的方法,
synchronized public void doWork(){
///TODO
}
同步锁是谁:
对于非static方法,同步锁就是this.
对于static方法,我们使用当前方法所在类的字节码对象(Apple2.class).不要使用synchronized修饰run方法,修饰之后,某一个线程就执行完了所有的功能. 好比是多个线程出现串行.
解决方案:把需要同步操作的代码定义在一个新的方法中,并且该方法使用synchronized修饰,再在run方法中调用该新的方法即可.
-
案例:懒汉式的线程安全问题,高并发时,可能创建多个实例
-
双重检查加锁:尽量减小synchronized的作用域,损耗性能
所谓“双重检查加锁”机制,指的是:并不是每次进入getInstance方法都需要同步,而是先不同步,进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块,这是第一重检查,进入同步块过后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。“双重检查加锁”机制:使用volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。
提示:由于volatile关键字可能会屏蔽掉虚拟机中一些必要的代码优化,所以运行效率并不是很高。 -
同步锁(Lock):
-
day19-线程不安全--线程同步机制:锁机制
最新推荐文章于 2021-11-22 15:54:38 发布