多线程总结

一、基本概念

多线程栈内存不共享,一个线程对应一个栈

二、线程创建的两种方法

1、写一个类,继承Thread,重写run方法
2、写一个类,实现Runnable接口,实现run方法
3、使用匿名内部类

三、线程的生命周期

创建,就绪,运行,阻塞,死亡

start方法,使线程进入就绪状态
sleep方法,是线程进入阻塞状态
interrupt方法,终止线程睡眠(本质是使sleep抛出异常,终端睡眠)
stop方法,强行终止线程,会丢失数据,不建议使用

四、线程调度

抢占式调度
均分式调度

和线程调度有关的方法:
实例方法setPriority()设置优先级。getPriority()获取线程优先级,最高是10,最低1,默认为5
实例方法join,合并线程,作用是是当前线程阻塞,在调用join方法的线程执行结束后,当前线程才会继续执行

六、多线程并发环境下,数据的安全问题

在工作中,项目是运行在服务器上的,而服务器已经将线程的定义,创建,启动等实现了,不需要我们写,所以我们关注的重点是线程的安全问题
1、什么时候存在数据安全问题?
多线程并发
共享数据
共享数据有修改行为

2、解决线程安全问题
使线程排队执行,不能并发,称为线程同步机制,为了数据安全,会牺牲效率
异步就是并发,同步就是派对
线程同步机制,一个对象对应一把锁

3、有哪些变量有线程安全问题
java中有三大变量,实例变量,在堆中,静态变量在方法区中,局部变量在栈中。
因为局部变量在栈中,不会被共享(一个线程一个栈),所以局部变量不会存在线程安全问题,同属常理由于不可修改,也不会存在线程安全问题

拓展:
StringBuffer底层加锁,StringBuilder底层不加锁。在局部变量中不存在线程安全问题,所以建议使用StringBuilder,可以提高程序效率。

4、Synchronized同步方法和同步块,哪个更好?
同步方法:
缺点:synchronized出现在实例方法上,一定锁的是this,没的挑,只能是this,不能是其他对象,所以这种方法不灵活。另一个缺点是,synchronized出现在实例方法上,表示整个方法体都需要同步,可能会无故扩大同步范围,导致程序执行效率降低,所以这种方式不常用。
优点:代码写的少,节俭。如果整个方法都需要同步,且共享的对象就是this,建议使用这中方式。

七、守护线程

特点:是一个死循环,所有线程结束后,守护线程自动结束
setDaemon(true)在启动线程之前将线程设置为守护线程,用户线程结束后,守护线程自动结束

八、定时器

间隔时间内执行特定的方法

九、wait和notify

wait和notify不是线程对象特有的方法,是在java中任何一个java对象都有的方法,是Object自带的。
wait作用,让当前线程进入等待状态,无限等待,直到被唤醒为止。调用notify将其唤醒。

你可能感兴趣的:(多线程总结)