这是我在csdn上面发表的第一篇文章,也是当作自己学习的一个记录。
在b站大学初学多线程 以下内容全靠回忆和理解完成,如有不对或者遗漏的地方,敬请指正。
Thread
是一个父类,代表线程的模版,继承他的子类要需要改写run方法以让线程干活
子类对象必须要使用start方法去启动线程
线程 声明周期:就绪 运行 (阻塞) 死亡,其中线程被阻塞就会回到就绪状态
New多个thread的同一个子类对象可以实现多线程(这几个线程去同时执行thread子类中的run方法)
在tread子类中可以定义属性,每个线程可以操作这些属性。将属性中的变量设置为static 以让多个线程去操作同一个属性。(static修饰器修饰的属性和方法只能在内存中存储一份)
上面的操作会导致线程安全问题
runnerable
是一个接口。需要对象去实现(改写子类的run方法),使用方法是将其重写后的子类对象赋值给thread方法。并且创建thread对象去实现线程。
thread方法 源码实现大致方法(理解认知版):
Thread(runnerable对象)
{
run()//线程执行的操作
[if 括号内有runnerable对象形参
将自己的run方法指向runnerable对象中的run方法
并且将对象中的属性变为静态属性赋给自己] 用重载的方法实现(猜测)
start();//初始化并运行一个线程
}
Runnerable 知识点 :runnerable是接口 实现其必须重写run方法。
实现对象中可以定义共享数据
以上的Runnerable 方法也会导致线程的不安全 ,因此要在改写run方法的时候加入锁。
锁
锁的作用 :让多个线程在改写共享数据时变成单线程改写(一个线程在改写共享数据的同时另一个线程无法对数据进行判断 改写(相当于另一个线程被阻塞)),以确保线程的安全性。
synchronized
使用方法
synchronized(对象){
需要锁住的方法(一般为改写的run方法)
}
多线程中每个线程必须要用同一把锁 也就是每个synchroized 方法的形参必须要同一个对象,不然会导致多个线程使用了不同的锁。仍然会有安全问题。
在runnerable方法中,由于run方法是在runnerable接口实现类中实现。并且多个线程只调用了一个runnerable的接口实现类作为形参,因此锁形参可以采用this关键字:即指向当前的runnerable实现类,来保证多个线程共用一个锁(因为多个线程只共用了一个runnable类)
在只用tread的方法中,多个线程会new多个tread对象,导致锁不能使用当前对象及其属性、方法,因此不能使用this方法。但是可以new一个static对象让锁去调用,以实现唯一的锁。还可以调用当前类.class来作为锁的形参,因为类在内存中只加载一次,所以仍然可以保证锁的唯一性。
syncronized 修饰方法
将需要加锁的方法用syncronized关键字进行修饰,可以使该方法内的所有操作都上锁。适用于将多线程所实行的操作进行包装,统一上锁。
注意:要将方法包装必须要将方法声明为静态方法,以保证锁的唯一性。
静态方法的限制:静态方法里不能直接调用当前类中非静态的属性和变量。