java线程锁

 

线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,
而无写操作,一般来说,这个全局变量是线程安全的;
若有多个线程同时执行写操作,一般都需要考虑线程同步,
否则的话就可能影响线程安全

 

 

public class Demo5Ticket {

    public static void main(String[] args) {
        //创建线程任务对象
        Ticket ticket = new Ticket();
        //创建三个窗口对象
        Thread t1 = new Thread(ticket, "窗口1");
        Thread t2 = new Thread(ticket, "窗口2");
        Thread t3 = new Thread(ticket, "窗口3");

        //卖票
        t1.start();
        t2.start();
        t3.start();
    }

    static class Ticket implements Runnable {

//        Object lock = new Object();
        ReentrantLock lock = new ReentrantLock();
        private int ticket = 10000;

        public void run() {
            String name = Thread.currentThread().getName();
            while (true) {
//                synchronized (lock) {
                lock.lock();
                sell(name);
                lock.unlock();
//                }
                if (ticket <= 0) {
                    break;
                }
            }
        }

        //private synchronized void sell(String name) {
        private void sell(String name) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (ticket > 0) {
                System.out.println(name + "卖票:" + ticket);
                ticket--;
            }
        }
    }
}

 


 

 

 

当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,
就容 易出现线程安全问题。 要解决上述多线程并发访问一个资源的安全问题,
Java中提供了同步机制 (synchronized)来解决。

 

 

同步代码块


Object lock = new Object();

//创建锁

synchronized(lock){      

//可能会产生线程安全问题的代码

}

 

 

同步方法

//同步方法

public synchronized void method(){    

//可能会产生线程安全问题的代码

}

 

 

 

 

 
posted @ 2021-11-16 23:21  AngDH  阅读(28)  评论(0编辑  收藏  举报