线程安全问题


当多个线程共同使用同一数据时候,可能会导致数据错乱,容易发生线程安全问题;


解决方案:使用同步代码块把需要一起运行的代码包裹起来,以达到数据安全的目的.

public class Demo_Synchronized {

        /**
         * @param args
         * 需求:铁路售票,一共100张,通过四个窗口卖完.
         */
        public static void main(String[] args) {
            TicketsSeller t1 = new TicketsSeller();
            TicketsSeller t2 = new TicketsSeller();
            TicketsSeller t3 = new TicketsSeller();
            TicketsSeller t4 = new TicketsSeller();

            t1.setName("窗口1");
            t2.setName("窗口2");
            t3.setName("窗口3");
            t4.setName("窗口4");
            t1.start();
            t2.start();
            t3.start();
            t4.start();
        }

    }

    class TicketsSeller extends Thread {
        private static int tickets = 100;
        static Object obj = new Object();
        public TicketsSeller() {
            super();

        }
        public TicketsSeller(String name) {
            super(name);
        }
        public void run() {
            while(true) {
                synchronized(obj) {
                    if(tickets <= 0) 
                        break;
                    try {
                        Thread.sleep(10);//线程1睡,线程2睡,线程3睡,线程4睡
                    } catch (InterruptedException e) {

                        e.printStackTrace();
                    }
                    System.out.println(getName() + "...这是第" + tickets-- + "号票");
                }
            }
        }
    }

  • Vector是线程安全的,ArrayList是线程不安全的
  • StringBuffer是线程安全的,StringBuilder是线程不安全的
  • Hashtable是线程安全的,HashMap是线程不安全的
原文地址:https://www.cnblogs.com/loaderman/p/6411184.html