/**
* 互斥锁:
* synchronized(对象/类 对象){代码}//必须是同一个对象
* public synchronized void method(){}
* 重量级锁,JDK1.6对synchronized进行了优化
* 为了减少获得锁和释放锁带来的性能消耗引入的偏向锁和轻量锁
* synchronized有三种方式来加锁,分别是:
* 修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
* 静态方法,作用于当前类对象加锁,进入同步代码前要获得的当前类对象的锁
* 代码:指定加锁对象,对给定对象加锁,进入同步代码块之前要获得给定对象的锁
* 同步方法:
* 依然涉及同步锁对象,不需要我们写出来
* 非静态的同步方法,同步锁就是this
* 静态的同步方法,同步监视器就是类本身
*
* 同步代码块:
* 选好同步监视器(锁),推荐使用类对象,第三方对象,this
* 在实现接口创建的线程类中,同步代码块不可以用this来自充当同步锁
*
* 同步的方式,解决线程安全的问题
* 操作同步代码时,只有一个线程能参与,其他等待
* 相当于当线程的过程,效率很低
*
* synchronized只针对于当前虚拟机可以解决线程安全问题,不能跨JVM解决问题,集群架构里没用
*
* 实例方法:调用该方法的实例
* 静态方法:类对象
* this:调用该方法的实例对象
* 类对象:类对象
*
* 操作共享数据的代码
* 共享数据:多个线程共同操作的变量,都可以充当锁
*
* 死锁:
* 多个线程都占用了对方的锁资源,但不肯想让,导致了死锁,在编程是一定要避免死锁的发生
* 条件:
* 互斥使用
* 不可抢占
* 请求和保持
* 循环事件
*
* 线程重入
* synchronized可重入锁
*
* 无锁:不加锁
* 偏向锁:不锁锁,只有一个线程争夺时,偏向某一个线程,这个线程不加锁
* 轻量级锁:少量线程来了之后,想尝试自旋转,不挂起线程
* 重量级锁:排队挂起(暂停)线程 (synchronized)
*
* Object类对多线程的支持
* wait():释放cpu资源,释放锁
* wait(long timeout):当前线程进入等待状态
* notify():唤醒正在等待的下一个线程
* notifyAll():唤醒正在等待的所有线程
* 线程间的通信
* 比如两条线程,共同运行
* 如果线程A先走,线程B等待,等待A走完,唤醒线程B,线程B再走
*
* Thread的两个静态方法:
* sleep释放CPU资源,但是不会释放锁
* yield释放cpu执行权,保留了CPU的执行资格,不常用
* join方法:出让执行权,join就加入进来
*
* 线程的退出
* 使用退出标志,线程正常退出
* 不要使用stop方法
*
* 使用interrupt方法会抛出异常
* 捕获后再做停止线程的代码(逻辑)即可
* volatile在void前加,线程间可见
*
* 线程的常用方法:
* Thread:
* start:启动当前线程,执行run方法
* run
* currentThread:静态方法,获取当前正在执行的线程
* getId():当前线程在执行过程中的唯一标识
* getName()
* setName()
* getPriority():获取当前线程的优先级
* setPriority():设定优先级
* getState():获取当前线程的生命周期
学习心得:
概念都了解,会用
学习感受:
感受是多线程难度比较复杂,明天讲其他锁,我有信心学会