/** * 线程安全问题产生的解决思路: * 就是将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候 * 其它线程时不可以参与运算的 * 必须要当前线程把这些代码都执行完毕后,其它线程才可以参与运算 * * 在java中,用同步代码块就可以解决这个问题 * * 同步代码块的格式: * synchronize(对象) * { * 需要被同步的代码; * } * * 同步的好处:解决了线程的安全问题 * * 同步的弊端:相对降低了效率,因为同步外的线程都会判断同步锁 * * 同步的前提:必须有多个线程并使用同一个锁 * @author 罗摩衔那 * */ class Tick1 implements Runnable{ private int num=100;//定义一百张票 Object obj=new Object(); public void run() { while(true) { synchronized(obj) { if(num>0) { try {Thread.sleep(10);}catch(InterruptedException e) {} System.out.println(Thread.currentThread().getName()+"...sale..."+num--); } } } } } public class Ticket_Demo3 { public static void main(String[] args) { Tick1 d=new Tick1();//创建一个线程任务对象 Thread t1=new Thread(d); Thread t2=new Thread(d); Thread t3=new Thread(d); Thread t4=new Thread(d); t1.start(); t2.start(); t3.start(); } }
温馨小提示:如果不加入synchronize(对象){}函数块,就会出现线程安全现象的产生.synchronize中的对象相当于一把锁,个人理解为缓存区,一旦一个线程进入就必须执行完己身任务,相当于缓存区已满,其它线程就无法进入.