zoukankan      html  css  js  c++  java
  • 线程安全问题例子

    面试题总是会问写一个线程安全问题的例子,最简单的就是多线程操作同一个成员变量,而且方法没有加锁;如下:

    • 解决方法可以是写一个safeMethod方法,然后直接使用synchronized 关键字,
    • 也可以使用AtomicInteger ,直接使用incrementAndGet方法.基于cas操作的进行增加也是线程安全的
    
    import java.util.concurrent.CompletableFuture;
    import java.util.concurrent.CountDownLatch;
    
    /**
     * @author <a href="mailto:15268179013@139.com">yida</a>
     * @Version 2020-04-22 14:30
     * @Version 1.0
     * @Description ThreadUnSafeDemo
     */
    public class ThreadUnSafeDemo {
    
      //    private AtomicInteger value = new AtomicInteger(1);
      private static int value = 1;
    
      public static void main(String[] args) throws InterruptedException {
    
        CountDownLatch latch = new CountDownLatch(1);
    
        for (int i = 0; i < 5; i++) {
          CompletableFuture.runAsync(() -> {
            while (true) {
              System.out.println("正在出票" + (value++) + "");
    //            safeMethod();
              if (value > 80) {
                latch.countDown();
              }
              try {
                Thread.sleep(1000);
              } catch (InterruptedException e) {
                e.printStackTrace();
              }
            }
          });
        }
        latch.await();
        System.out.println("执行完毕...");
      }
    
      public synchronized static void safeMethod() {
        System.out.println("正在出票" + (value++) + "");
      }
    
    }
    
    
    世界上所有的不公平都是由于当事人能力不足造成的.
  • 相关阅读:
    Spring_3.1
    handler发消息的形式
    css元素排列
    利用Socket远程发送文件
    jtree添加节点
    url传参中文乱码
    struts action和jsp之间的传值
    Struts 404 The requested resource is not available
    tomcat server需要重启的时刻
    c++获取系统时间(引用别人的博文)
  • 原文地址:https://www.cnblogs.com/javayida/p/13346745.html
Copyright © 2011-2022 走看看