1.synchronized 的理解。
被 synchronized 修饰的代码代表同步。在线程中有两种同步的方法,一个是代码同步,一个是方法同步,同步后,同一时间,只能有一个线程执行同步的方法或者代码块。然而在此时刻,没有同步的其他代码,仍然可以执行不受影响。这个还不是重点,重点是当前这个对象里的其他同步地方,都会被阻塞。
补充:
-指定加锁对象:对给定对象加锁,进入同步代码前,要获得给定对象的锁。
-直接用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
-直接作用于静态方法:相当于当前类的加锁,进入同步代码前要获得当前类的锁。
注意的地方:我犯过的错。
作用于实例方法上面,实际上是对实例对象加锁,而此时对象的实例可以创建多个,每一个实例都有一把锁。互不影响。如果是类的共享资源需要加锁,就不要用实例的方法同步了,有两种方法可以解决1.将对象的方法声明为静态,然后在方法上使用,synchronized 其实就相当于对类进行加锁 2.对类的class 加锁。
2.wait() ,notify() 有什么特点?
wait() 并不是线程本身自带的方法,notify() 也不是,他们是Object 对象的方法。wait():使当前线程处于等待状态,此时cpu 的时间片,交由其他线程处理,使用notify() 可以唤醒等待的线程
还有一个notifyall(),会唤醒所有等待的线程。
cpu 的时间片会被交还回来。继续执行下面的代码。
使用的业务场景: 子线程循环10次,主线程循环100次,接着子线程循环10次,主线程循环100次。。。。如此循环50次。分析在代码里面。
运行结果: