多线程主要考虑的是多个线程对共有资源的冲突!!!
多线程的不确定性!
一、基础概念
实现多线程有两种方式 实现Runnable接口、 继承Thread (实际Thread也是实现Runnable接口) 重写对应的run()方法
调用start()方法是启动线程 调用run()方法其实相当只是调用了这个类的run(),并没有开启线程!
二、synchronized(互斥锁,共用资源线程串行依次执行)
1、在方法上加上synchronized,那么对于同一实例,会依次等待,但对于不同实例来说没效果!(执行完毕或抛出异常则释放锁)
2、锁的粒度要尽量小
3、经典的单例模式(懒汉中不建议使用直接在genInstance()方法上加锁,虽然能达到效果,但效率低)
经典 double check
三、interrupt 中断:将在blocked或wait pool中的线程结束阻塞状态,重新回到runnable就绪状态/lock pool(ps,执行interrupt后并不是立刻将该进程回到runnable,有调度时间差!!! 多线程调度都有时间差)
interrupt
四、join
在thread1中调用thread2().join
五、wait
调用wait(),进入等待池(特殊的阻塞),只有获得锁的线程才可以获取执行资源
wait和notify必须在synchronized方法或块中
sleep()方法会释放CPU,但不释放锁!
自私线程:在run中设置了大循环的线程
礼貌线程:在run中主动调用yield()方法
六、J.U.C
后续补充