线程的状态:
线程创建的第二种方式:
将任务封装成对象:
方法二的好处(区别):
__
___
继承 Thread和实现 RuntimeThread 小区别
如果当你想实现4个线程同时对一个元素进行操作,就用Run
如果你想4个线程 四个元素就用Thread
因为当你使用继承Thread的 时候,你就创建了4个对象 开辟了四个空间;
而你去实现Run方法的时候,只用创建一个对象,和4个线程对象。他们公用一个对象的数据;
——)————
多线程的安全隐患:
只能catch不能throws的情况;
当你实现的接口没有声明异常,所以你实现了接口,也不能声明异常。只能catch;
安全问题:因为当你4个线程同时运行的时候,可能在最后判断的时候会出现,四个线程都已经进来,比如 if(num>0) 当num=1的时候,四个线程都已经完成了判断,准备进行其他处理,但是当第一个线程运行完时,num=0;到第二个线程继续运行的时候,num=-1。。所有会有安全隐患;
__
安全问题发生的原因:
——————————————
解决方法:同步代码块
注意我们传递了一个object的对象进来.
_____
同步的好处和坏处:
________
同步的前提:
如果只有一个线程,那么就不需要同步;
___
当你线程的run();内部调用其他的方法的时候,被调用的方法也变成了线程的代码,
所以 如果在被调用的方法中又安全隐患也需要解决。
————————
解决方法2:同步函数
——————
同步函数的锁:
同步函数用的锁死this;同步代码块用的是obj(就是传进同步代码的对象);
__
同步函数和同步代码块的区别:
同步函数可以看成同步代码块的简写,当你使用的是this作为对象的时候,
就可以使用同步函数。
————————
静态函数的同步函数锁:
当你的函数是静态函数的时候,我们同步函数 使用的class的字节码对象.
this.getclass()获取当前class的字节码对象。
应为当我们进内存的时候我们是先找到字节码对象。所以我们静态函数会去使用
这个字节码对象。
一个Class只有一个字节码对象,而获取字节码对象有两种方式
——————————
单例设计同步问题:
当我们使用懒汉式的时候,如果使用多线程会出现 安全问题。所以我们给他加上
同步,但是当我们使用同步函数来解决安全问题的时候,就会发现,当你S不等于
空的时候,他每一次运行还是要判断 锁。这样降低了我们开发效率。
所以我们使用同步代码块,但是这样还没解决,效率问题,所以我们在 锁前面在
加一个判断,这样就解决了判断问题。
但是我们可以发现 懒汉式还是相对麻烦。一般我们还是使用饿汉式。
————————
死锁:
死锁容易发生的情况:同步的嵌套。
死锁例子:
————————
注意事项:
我们要实现同步必须是每一个线程使用的都是同一个锁;