线程同步问题,一般解决是添加同步锁,可以使用synchronized关键字,可以修饰方法、代码块
代码块:
// 1.代码块
synchronized(同步对象){
//业务逻辑
}
// 2.方法
public synchronized void doDemo(){
//业务逻辑
}
下面看一个出票问题栗子
出票线程:
package com.pimee.sync;
public class TicketThread implements Runnable {
private int ticket = 10; // 票数
public void run() {
while (true) {
synchronized (this) { // 要对当前对象加锁
if (ticket > 0) { // 还有票
System.out.println("余票:ticket = " + ticket--);
} else {
break;
}
}
}
}
}
测试类:
package com.pimee.sync;
public class TicketTest {
public static void main(String[] args) {
TicketThread ticket = new TicketThread();
for (int i = 0; i < 10; i++) {
Thread t = new Thread(ticket);
t.start();
}
}
}
测试结果: