并发编程的原因
- 多个线程操作共享数据
- 操作共享数据的指令多条
当一个线程执行操作共享数据的多条指令过程中,其他线程参与了运算,这就回导致线程安全问题;
解决思路
将操作共享数据的多条指令封装起来,当有线程执行这些指令的时候,其他线程不得参与运算,必须要当前线程执行完毕后,其他代码才可以参与运算
解决方案:
1.synchronized同步块
2.Lock提供的api
同步的好处
解决线程安全问题
同步的弊端
相对降低了效率,因为需要同步的线程都会判断同步锁
同步的前提
多个线程必须使用同一个锁
多线程的示例:四个窗口,售卖100张票(示例代码有一个奇怪的现象)
@Test
public void testSellTicket() throws InterruptedException {
Ticket ticket = new Ticket();
new Thread(ticket,"A").start();
new Thread(ticket,"B").start();
new Thread(ticket,"C").start();
new Thread(ticket,"D").start();
Thread.sleep(10000);
System.out.println("end .....");
}
static class Ticket implements Runnable {
private int count = 100;
private static final Object lock = new Object();
@Override
public void run() {
while(true){
synchronized (lock) {
if(count > 0) {
try { Thread.sleep(10); } catch (InterruptedException e) { }
System.out.println(Thread.currentThread().getName() + " ticket + " + --count);
} else {
break;
}
lock.notifyAll();
}
}
}
}