1、线程安全问题出现的原因 -----
多个线程访问统一资源,有可能出现线程安全问题
解决方法-> Ⅰ使用synchronized锁{}Ⅱ使用代码块儿解决线程安全问题,不能将统一资源的变量放置外面,任何对象都可以当锁: 每一个对象身体里面都有一个开关
2、synchronized那些事
2.1 ynchronized 修饰一个方法,表示该方法是线程安全的,即该方法在同一时间点只有一个线程在使用,直到该方法执行完毕为止
2.2synchronized 修饰一个非静态方法: 该锁指的是这个类的实例化对象 this
2.3synchronized 修饰一个静态方法: 该锁指的是这个类的序列化文件 WindowThread02.class
3 线程安全问题: 使用哪个方案比较好? 使用代码块儿
* 1) 使用代码块儿可以指定锁对象
* 2) 使用代码块儿更灵活 代码一旦加了锁,更安全,但是效率极低,我们可以灵活地将出现线程安全问题的代码块儿加锁
4 1、出现安全问题原因?
* 2、咋解决?
* 3、颗粒度 越小越好 synchronized(""){
*
* }
* 4、静态方法和非静态方法,锁对象分别指的是? 类的字节码文件 非静态: 当前的this对象
* 5、sleep() 不会释放锁资源
5 死锁:
* 多个线程访问多个公共资源,有可能出现死锁
* 死锁现象没有技术可以解决,只有写代码规避
6 // 线程的第二种写法
/**
*
* 1、实现Runnable 接口,重写run方法
* 2、实例化实现了Runnable 接口的类,当做参数传递给Thread构造方法
* 3、通过thread的实例化对象启动线程
*
*
*
* 两种方案: 哪种好? 第二种好
* 1、java是单继承的。 如果你编写了一个线程的子类,就无法继承其他类
* 2、java讲究 什么人干什么事儿 Thread已经是一个成熟的类,它主要干启动线程、线程等多个操作即可,就没必要干业务逻辑的事儿(代码可以对多个线程共享)
* 所以如果要写逻辑,请交给其他类来做。 狗 猫
7 /**
*
* 如何停止一个线程?
* 建议方案: 使用标志
*
* 1、stop: 暴力执法,直接停止正在运行的线程,而不管你的业务逻辑现在干什么?
* 2、使用标志停止线程,业务逻辑非常完整,非常符合真实的情景
*/
8
* wait() 等待 notify() 唤醒
* 1、这两个方法不是Thread里面独有的,而是Object类的方法
* 2、wait() 和 notify() 必须在同步代码块儿或者同步方法中才能调用
* 3、wait() 将当前线程进入等待状态 notify() 唤醒目前线程池中的一个等待的线程 notifyAll() 唤醒全部
* 4、wait() 和 notify() 调用者是锁对象
*/