引言
接上一篇,Java进阶 ——— Java多线程(二)之如何开启多线程
介绍了Java多线程的开启方法,但是多线程运行的安全问题,将是本篇的重点
延伸阅读,Java多线程系列文章
Java进阶 ——— Java多线程(一)之进程和线程
Java进阶 ——— Java多线程(二)之如何开启多线程
Java进阶 ——— Java多线程(三)之多线程同步问题
在第一篇文章中,提到要实现多线程安全,就要实现线程同步,那么线程同步有哪些方法呢?
介绍线程同步之前,先大概了解一下多线程的原理。
线程的执行是CPU随机调度的,比如我们开启N个线程,这N个线程并不是同时执行的,而是CPU快速的在这N个线程之间切换执行,由于切换速度极快使我们感觉同时执行罢了。发生上面问题的本质就是
CPU对线程执行的随机调度
,比如A线程此时正在打印信息还没打印完毕此时CPU切换到B线程执行了,B线程执行完了又切换回A线程执行就会导致第一篇文章中打印错乱问题。
线程同步问题往往发生在多个线程调用同一方法或者操作同一变量,但是我们要知道其本质就是CPU对线程的随机调度,CPU无法保证一个线程执行完其逻辑才去调用另一个线程执行。
线程同步
所以解决线程同步的思路就是:保证一个线程在执行方法的时候如果没执行完那么另一个线程不能执行此方法,换句话说就是只能等待别的线程执行完毕才能执行,确保数据在任何时刻只有一个线程可以操作,保证数据完整性
为了解决线程同步问题,引入锁
的概念
synchronized
synchronized同步有两种方式,同步代码块和同步方法
synchronized 同步方法
在方法上加上synchronized关键字,实际上锁的是this,即当前类对象,
如下列代码,例如外部要调用run方法,则需要创建ThreadRunnable对象实例,此时添加在run方法上的锁,实际是对实例对象加锁。
class ThreadRunnable implements Runnable {
@Override
public synchronized void run() {
age++;
System.out.println(Thread.currentThread().getName() + "----" + age);
}
}
</