今天下雨了,天气有点凉。
休息了一天,身体好了点,学习的专注度提高了。今天学习多线程的状态,创建线程的第二种方式,多线程产生的安全问题和同步锁。
首先讲了多线程的状态,线程被创建,有运行状态,冻结状态,临时阻塞状态,然后线程的消失。运行状态具有cpu的执行权和执行资格。执行资格是可以被cpu处理,在处理队列中排队,执行权是正在陪cpu处理。运行状态可以通过sleep和wait方法转换到冻结状态,冻结状态失去了cpu的执行权和执行资格。当cpu在随机切换的时候,没有被cpu处理的状态叫做临时阻塞状态,拥有cpu的执行资格。Cpu的临时阻塞状态和运行状态来回的切换,冻结状态可以转变为临时阻塞状态,而临时阻塞状态需要转换到运行状态才能转换到冻结状态。
创建线程的第二种方式是实现Runnable接口
1,定义类实现Runnable接口
2,覆盖接口中的run方法,将线程任务代码封装到run方法中
3,通过Thread类创建线程对象,并将Runnable接口的子类对象作为构造函数的参数进行传递。(因为线程的任务都封装在Runnable接口子类对象的run方法中,所以要在线程对象创建时就必须明确要运行的线程任务)
4,调用线程对象的strat方法开启线程
实现Runnable接口的好处
1,将线程的任务从线程的子类中分离出来,继续了单独的封装。按照面向对象的思想将任务封装成对象。
2,避免了java单继承的局限性。
所以这种方式较为常用。
多次启动一个线程是非法的。
线程安全问题产生的原因:
1,多个线程在操作共享的数据。
2,操作共享数据的线程代码有多条。
当一个线程在执行操作共享数据的多条代码过程中,其它线程参与了运算,就会导致线程安全问题的产生。
解决思路:将多台哦操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其它线程是不可以参与运算的,必须要等当前线程把这些代码都执行完成后,其它线程才可以参与运算。
关键字synchronized,称为同步,用同步块和同步方法解决这类问题。
同步的好处:解决了线程的安全问题。
同步的弊端:相对降低了效率,因为同步外的线程都会判断同步锁。
同步的前提:同步中必须有多个线程并使用一个锁。
同步函数和同步代码块的区别:
同步函数的锁是固定的this。
同步代码块的锁是任意的对象。
还介绍了多线程下的单例,懒汉式需要用同步快解决安全性问题,需要用if语言判断来解决效率问题。
最后讲了死锁。常见的情景之一就是同步的嵌套
---------------------- android培训、 java培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net/heima