• 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(){    

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

    }

     
  • 相关阅读:
    bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]
    luoguP1886 滑动窗口 [单调队列]
    bzoj1047: [HAOI2007]理想的正方形
    bzoj1012: [JSOI2008]最大数maxnumber [单调队列]
    树与二叉树之二--二叉树的性质与存储
    树与二叉树之一--基本概念与存储结构
    Markdown段首空格
    C++ atan2
    凸包学习笔记
    Codeforces Round #545 (Div. 1) E. Train Car Selection
  • 原文地址:https://www.cnblogs.com/angdh/p/15564422.html
Copyright © 2020-2023  润新知