子线程实现方式:
- 继承Thread类;
- 实现Runnable接口。
什么情况下需要同步?
- 当多线程并发,有多段代码同时执行时,我们希望某一段代码在执行的过程中,不要切换到其他线程工作,这时就需要同步。
- 如果两段代码是同步的,那么同一时间只能执行一段,在一段代码执行结束之前,不会执行另外一段代码。
同步代码块:
- synchronized加上一个锁对象来定义一段代码,这就叫同步代码块。
多个同步代码块如果使用相同的锁对象,那么他们就是同步的。
同步方法:
- 只需要在方法上加synchronized关键字即可。
非静态方法的锁对象是this;
静态方法的锁对象是当前类的字节码文件。
注意:
- 被多个线程共享的成员变量需要加static修饰。
- 多次开启一个线程是非法的。
JDK1.5新特性:互斥锁
- 同步
使用ReentrantLock类的lock()和unlock()方法进行同步。 - 通信
使用ReentrantLock类的newCondition()方法可以获取Condition对象。
需要等待的时候使用Condition的await()方法,唤醒的时候用signal()方法。
不同的线程使用不同的Condition,这样就能区分唤醒的时候找哪个线程了。