(一)同步问题
- 不同步操作:
当有多个线程启动时,所有的代码是依次进入到run()方法中的。
真正进入到方法的对象可能是多个,也可能是一个。进入代码的顺序可能有差异,但是总体的执行是并发执行。线程不安全。 - 同步操作
所有的线程不是一起进入到方法中执行,而是按照顺序一个一个进来。
线程安全。
(二)synchronized处理同步问题
- 同步代码块
同步代码块在方法里面使用,也就是说依然可能有多个线程对象同时进入方法。
在同步代码块中会按照线程对象的优先级使用。 - 同步方法
使用synchronized修饰的方法。 - 同步虽然可以保证数据的完整性(线程安全操作),但是其执行的速度会很慢。
同步代码块与同步方法的使用:
同步代码块
class MyThread implements Runnable{
private int ticket = 10;
@Override
public void run() {
synchronized (this){
while (ticket > 0) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "还有" + ticket-- + "张票");
}
}
}
}
同步方法:
class MyThread implements Runnable{
private int ticket = 10;
@Override
public void run() {
<