JAVA-线程篇

线程和进程的区别?

1、进程式系统进行资源分配的基本单位,有独立的内存地址空间;线程是CPU调度的基本单位,没有单独的地址空间,有独立的栈,局部变量,寄存器,程序计数器等。

2、创建进程的开销大,包括创建虚拟地址空间等需要大量系统资源;创建线程开销小,基本上只有一个内核对象和一个堆栈

3、一个进程无法直接访问另一个进程的资源,同一个进程内的多个线程共享进程的资源

4、进程切换开销大,线程切换开销小,进程间通信开销大,线程间通信开销小

5、线程属于进程,不能独立执行,每个进程至少有一个线程称为主线程

线程生命周期的六种状态?

1、NEW(初始化状态):表示线程新建出来还没有被启动的状态

2、Runnable(可运行状态):表示线程正在运行,也可能是线程在就绪队列里等待运行

3、Blocked(阻塞状态):线程在等待获得锁

4、Waiting(无时间限制的等待状态):线程在等待某种资源就绪,对于生产者消费者模式,消费者准备获取某个数据,但是生产者还没有准备好,这时线程就处于等待状态。wait()方法可以使线程处于等待状态,notify()可以接触这种等待。Thread.join也可以使线程处于等待。

5、Timed_Waiting(有时间限制的等待状态):和等待相似,但是它调用的是带有超时时间的方法

6、Terminated(终止状态):线程正常退出或异常退出后,就处于死亡状态

sleep和wait的区别?

1、sleep是Thread中的方法,wait是Object中的方法

2、sleep不释放锁,wait释放锁

3、sleep在任何地方中都能使用,wait在同步方法或同步代码块中使用

4、wait不需要捕获异常,sleep需要捕获异常

线程创建的方式:

1、继承Thread类

2、实现Runnable接口

3、实现Callable接口

4、线程池

使用 start方法启动线程的时候,JVM虚拟机会在内存中给线程分配一个独立的内存空间,有自己的局部变量等

run方法启动线程的时候,就是使用主线程运行,会按照顺序进行调度方法,不会出现抢占资源

实现Runnable接口比继承Thread类所具有的优势?

1、适合多个相同的代码去处理同一个资源

2、避免java中单继承带来的限制

3、增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

线程安全问题

synchronized关键字具体的使用

如图,synchronized可以用在方法上也可以用在代码块种,其中方法是实例方法和静态方法,锁分别是该类的实例对象和该类。而在使用代码块也可以分为三种。如果锁是类对象的话,尽管new多个实例对象,但他们仍然属于同一个类依然会被锁住,即线程之间保证同步关系

java线程阻塞的代价:

j如果线程状态切换是一个高频操作时,将会消耗很多CPU处理的时间;如果对于需要同步简单的代码块,获取锁挂起操作消耗的时间比用户代码执行的时间还要长,这种同步策略显然不好。synchronized会导致争不到的线程进入阻塞状态,是一个重量级的锁,jdk1.5开始引入了轻量锁和偏向锁,默认启用自旋锁,都属于乐观锁

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章