zoukankan      html  css  js  c++  java
  • java 线程 (三)线程并发的安全性 同步代码块

    package cn.sasa.demo1;
    
    import java.util.concurrent.ExecutionException;
    
    public class ThreadDemo {
        public static void main(String[] args) throws InterruptedException, ExecutionException {
            //创建Runnable接口实现类对象
            Ticket t = new Ticket();
            //创建3个Thread类对象,传递Runnable接口实现类
            Thread t0 = new Thread(t);
            Thread t1 = new Thread(t);
            Thread t2 = new Thread(t);
            Thread t3 = new Thread(t);
            
            t0.start();
            t1.start();
            t2.start();
            t3.start();
            /**
              * 线程安全问题一般发生在:
              * 多线程并发访问同一个数据资源
             *  
             *  没有加同步,通过线程休眠,出现了安全问题
             *  
             *   Thread-0 出售第 99
             *   Thread-1 出售第 98
             *   Thread-2 出售第 100
             *   Thread-3 出售第 97
             *   Thread-1 出售第 96
             *   Thread-0 出售第 96
             *   Thread-3 出售第 95
             *   Thread-2 出售第 94
             *   Thread-0 出售第 93
             *   Thread-1 出售第 92
             *   Thread-3 出售第 91
             *   Thread-2 出售第 91
             *   Thread-0 出售第 90
             *   Thread-1 出售第 90
             *   Thread-2 出售第 88
             *   Thread-3 出售第 89
             *   Thread-0 出售第 87
             *   Thread-1 出售第 87 ......
             *   
             *   解决安全问题: 线程同步
             *   synchronized(任意对象){
             *           线程要操作的共享数据
             *   }
             *   
             */
            
            
        }
    }
    package cn.sasa.demo1;
    
    public class Ticket implements Runnable {
        //定义出售的票源
        private int ticket = 100;
        //同步锁,对象监视器
        //没有锁的线程不能执行,只能等
        //
        private Object obj = new Object();
        
        public void run(){
            int flag = 100;
          while(flag > 0){
              //加入同步代码块,保证线程安全
              synchronized(obj) {
                  if( ticket > 0){
                        try {
                            Thread.sleep(200);
                        } catch (InterruptedException e) {
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }
                        System.out.println(Thread.currentThread().getName()+" 出售第 "+ticket--);
                      }
                  flag --;
              }
          }
        }
    }
  • 相关阅读:
    jquery mobile pages之间的跳转
    Javascript中this、prototype、constructor的理解
    javaScript的引号使用
    javaScript的事件
    我的css
    HTML5 canvas的事件
    java动态代理
    (转)面向对象的 JavaScript 编程:dojo.declare 详解
    Speex手册编解码介绍 中文翻译
    Android修改自己程序字体
  • 原文地址:https://www.cnblogs.com/SasaL/p/10191825.html
Copyright © 2011-2022 走看看