线程安全问题:
定义:Java并发编程实战这本书是这样说的:当多个线程访问某个类时,这个类始终保持正确的行为,那么这个类是线程安全的。
通俗一点说就是,一个线程访问的结果和多个线程访问的结果和预期结果是一样的。
线程安全实例:
public class ThreadDemo2 {
public static void main(String[] args) {
TicketThread ticketThread = new TicketThread();
Thread t1 = new Thread(ticketThread);
t1.setName("线程1");
Thread t2 = new Thread(ticketThread);
t2.setName("线程2");
Thread t3 = new Thread(ticketThread);
t3.setName("线程3");
t1.start();
t2.start();
t3.start();
}
static class TicketThread implements Runnable{
private static int ticket = 100;
Object object = new Object();
@Override
public void run() {
while (true){
if (ticket>0){
System.out.println(Thread.currentThread().getName()+"这是卖的第"+ticket+"张票");
ticket--;
}else {
break;
}
}
}
}
}
这里明显产生了线程问题,这就是很经典的卖票问题。
解决方案:
使用同步代码块保证线程安全。
synchronized (object){
if (ticket>0){
System.out.println(Thread.currentThread().getName()+"这是卖的第"+ticket+"张票");
ticket--;
}else {
break;
}
使用lock锁
ReentrantLock lock = new ReentrantLock();
lock.lock();
lock.unlock();