09_线程
1.线程是一个程序中不同的执行路径
2.进程是一个静态的概念,进程开始执行指的是进程中的主线程(main方法)开始执行
3.同一时间点一个CPU只能支持一个线程,但由于CPU的快速,人类感觉起来像很多线程在同时执行
4.Java的线程通过java.lang.Thread类来实现,当new一个Thread时一个线程被创建
5.每个线程都是通过某个特定Thread对象的run()方法来完成其操作的,方法run()称为线程体
6.通过调用Thread类的start()方法来启动一个线程
7.创建一个线程有两种方法,第一种:自定义类实现Runnable接口,第二种:自定义类继承Thread类(这种创建方式可直接调用start方法,实际上Thread实现了Runnable接口) 注:使用接口的创建方式更为灵活,建议使用接口方式
8.创建一个新线程有两步,第一步:定义一个类实现Runnable接口,在类中方法run中写线程体,第二步:new一个Thread并将自定义类对象作为参数传入,使用start方法让线程开始执行
9.线程状态转换

10.线程控制的基本方法

11.不推荐使用stop()或者interrupt()方法来结束线程
12.Thread的方法sleep()、join()、wait()都需要catch(InterruptedException e)
13.线程的优先级为1-10,默认为5,数字越大优先级越高,优先级越高执行的机会越多
14.使用一个boolean类型的变量来使线程停止,不要使用stop()或者interrupt()方法
15.无论怎么使用synchronized关键字,最终都是线程对对象加锁;当线程执行到synchronized处时,会去判断对应的对象是否已经被线程锁定(其他线程已加锁,当时尚未解锁);如发现对象还没被其他线程锁定,就会自己对对象加锁;如发现对象已经被其他线程锁定了,就会等待其他线程解锁后,再对该对象进行加锁操作;这里有一个特殊情况,就是当线程发现这个对象的锁就是自己加的时候,它可以再次对这个对象加锁而不会出现死锁(使用synchronized无需手动释放锁)
16.synchronized的使用方法(无论怎么锁,都要搞清楚线程是对哪个对象加了锁)
①public synchronized void method(...){...} 非静态方法,线程对调用方法的对象加锁
②public void method(...){... synchronized(想要锁住的对象的引用){...} ...} 对括号里引用指向的对象加锁
③public synchronized static void method(...){...} 静态方法,线程对方法所属的类的Class对象加锁
17.加大锁的粒度是解决死锁的一个方法,但是会降低效率
18.一个对象被线程加了锁(即该线程获取了该对象的锁,还没释放;主语不同),并不意味着这个对象现在只能被该线程使用,其他不需要获取锁就能执行的方法可以正常执行
19.互斥锁:同一时间,只有一个线程能获取锁
20.一般读取数据的方法不加锁(加锁影响效率),修改数据方法要加锁
21.wait()是Object的方法,作用是让当前正在访问本对象的线程wait(注意要该线程锁住本对象那它才有资格wait,线程wait会失去锁,但是sleep不会失去锁)
22.wait方法和notify方法配合使用(两个方法都是Object类中的方法),notify(叫醒一个当前在该对象上wait的线程)
23.被加锁和被解锁的主语是对象,获得锁和释放锁的主语是线程;加锁和解锁指的是线程对对象做的动作(个人理解)
24.锁涉及到JVM及一些底层,我暂时还不能理解,这篇笔记仅供参考
浙公网安备 33010602011771号