在初学多线程的时候我们可能会遇到如:三个售票窗口一起卖票最后多卖的情况或是售出同一张票,或是遇到一个账号同时银行取钱到最后余额不足还能取成的情况或是取同一笔钱,此时我们就要学会使用synchronized实现了线程同步。
在未使用时部分错误如下
此时只需要用
synchronized (this) {}将取钱的代码包裹起来就不会在出错(休眠可包括也可不包括)
使用了synchronized实现了线程同步,之后就不会出现多取的情况
// 这里使用了synchronized实现了线程同步 // 当多个线程执行到这里的时候,就会争夺this对象锁 // 那个线程争夺到(获取)this对象锁,就执行synchronized代码块,执行完后,会释this对象锁 // 争夺不到this对象锁,就blocked,准备继续争夺 // this对象锁是非公平锁
public static void main(String[] args) {
T t = new T();
Thread thread1 = new Thread(t);
thread1.setName("t1");
Thread thread2 = new Thread(t);
thread2.setName("t2");
thread1.start();
thread2.start();
}
}
//编程取款的线程
//1.因为这里涉及到多个线程共享资源,所以我们实现Runnable方式
class T implements Runnable {
private int money = 10000;
@Override
public void run() {
while (true) {
// 这里使用了synchronized实现了线程同步
// 当多个线程执行到这里的时候,就会争夺this对象锁
// 那个线程争夺到(获取)this对象锁,就执行synchronized代码块,执行完后,会释放this对象锁
// 争夺不到this对象锁,就blocked,准备继续争夺
// this对象锁是非公平锁
synchronized (this) {
if (money < 1000) {
System.out.println("余额不足");
break;
}
money -= 1000;
System.out.println(Thread.currentThread().getName() + "取出了1000当前余额为" + money);
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}