概述
多线程修改公共变量时,会引发bug,为了解决bug,要用到线程同步
- 第一步,先让一个线程读变量num的值
注意:具体是哪个线程不一定,由操作系统调度,图中由 线程1 执行 - 第二步,让该线程计算后将值写入内存
- 第三步,然后让另一个线程读变量num的值
- 第四步,让该线程计算后将值写入内存
锁
多线程编程中,当代码需要 同步 时会用到 锁。
Java为我们提供了 内置锁(synchronized) 和 显式锁(ReentrantLock) 两种同步方式。
显式锁是JDK1.5引入的
内置锁
Java内置锁通过synchronized关键字使用,使用其修饰方法或者代码块,就能保证方法或者代码块以同步方式执行。
显示锁
ReentrantLock的字面意思是可重入锁,可重入的意思是线程可以同时多次请求同一把锁,而不会自己导致自己死锁。
临界资源
某些公共资源 只能一个线程访问操作,这样的资源称为临界资源(互斥资源,共享变量)
如:商品数量、票号,或者打印机
临界区
访问临界资源的那段代码称为临界区
如:访问票号的代码
线程互斥
由于多线程要共享资源,而有些资源需要互斥使用,因此各线程间竞争使用这些资源
如:多线程修改公共变量,多线程访问打印机等
线程同步
多线程访问操作公共资源时,需要多个线程有顺序的执行,互相合作、互相等待,共同完成一项任务。
一般来说,同步往往包含互斥
