进程
线程
多线程实现方式
设置和获取线程名称
如果没有设置线程名称,会有默认名称Thread-num(num是数字值)
也可已通过带参构造方法在创建对象的时候给线程赋予名称
currentThread()方法可以返回当前正在执行的线程对象
线程调度
多线程程序执行有随机性,单个线程抢到CPU时间片才能执行
线程控制
Thread.currentThread().setName(“name”);
设置当前线程的名称
当主线程执行完毕,java虚拟机就会退出,守护线程退出,但不会立即消失
线程生命周期
实现方式2
线程同步
案例
思考
线程的执行随机性导致售票以下两个数据安全问题
为什么会出现数据安全问题
如何解决安全问题
破坏以上三个条件中的一个
同步代码块解决
同步代码块加锁注意任意对象需要是同一对象,不然没有锁的效果
同步方法解决数据安全问题
同步静态方法的锁对象是类的字节码
线程安全类
StringBuffer—StringBuilder
Vector—ArrayList
Hashtable—HashMap
三对类对比来看,前者的方法都加了synchronized都是同步方法,后者都没有加
通常Vector和Hashtable会被如下方法替代,同理可获得Set的线程安全类
Lock锁
使用try……finally是为了确保最终unlock能够被执行,确保锁能被释放
生产者和消费者问题
使用wait和notify方法必须要在存在锁对象的情况下
案例