多线程安全问题——访问共享
同步代码块Synchronized(锁对象){可能出现重写爱情问题的代码
}
1.通过代码块中的锁对象,可以使用任意对象
2.但必须保证多个线程使用的锁对象是同一个
3.锁对象作用:
把同步代码块锁住只让一个线程执行
//模拟卖票 //创建三个进程,同时开启,对共享的票进行出售 public class Demo02Ticket { public static void main(String[] args) { RunnableImpl run=new RunnableImpl(); Thread t1=new Thread(run); Thread t2=new Thread(run); Thread t3=new Thread(run); t1.start(); t2.start(); t3.start(); } }
锁对象解决安全重写和错误问题:
import java.util.Objects; public class RunnableImpl implements Runnable { private int ticket=100; Object obj=new Object();//创建锁对象 @Override public void run() { while (true){ synchronized (obj){ if (ticket>0){ //票存在,卖票ticket try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"-->正在卖"+ticket+"张票"); ticket--; } } } } }