概念
- 异步:多个线程同时对共享资源进行操作,在操作数据时,互相之间不需要等待。提高执行效率,降低了资源的安全性。
- 同步:多个线程在操作共享资源时,同一时刻只能有一个线程在操作相当于独占资源,另外的线程必须等待。牺牲了程序的执行效率,提高了资源的安全性。
售票员案例:
//这个类用来解决多线程并发时,数据安全问题
public class Test2_Synchronized {
public static void main(String[] args) {
// 启动线程
MySynchro target = new MySynchro();
Thread t1 = new Thread(target, "1号窗口:");
Thread t2 = new Thread(target, "2号窗口:");
Thread t3 = new Thread(target, "3号窗口:");
Thread t4 = new Thread(target, "4号窗口:");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
// 卖100张票
class MySynchro implements Runnable {
int tickets = 100;
//synchronized用在方法上,如果方法里的代码都被同步了,直接加方法上就行,这个方法里的代码就安全了,牺牲了性能
@Override
synchronized public void run() {
while (true) {
// synchronized同步代码块:把有问题的代码包起来,实现同步访问
// 对象?必须是多个线程使用的是 同一个 对象
// synchronized (对象) {
// synchronized (new Object()) {// new Object()是每次产生新的对象,可不是同一个对象
// synchronized (this) {// this是多个线程间共享同一个对象(本类对象)
if (tickets > 0) {
try {
// 暴露数据安全隐患
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + tickets--);
}
if (tickets <= 0) {
break;
}
}
// }
}
}