zoukankan      html  css  js  c++  java
  • 线程安全--- synchronized

    package com.Thread;
     
    class W12306 implements Runnable{
           private boolean flag = true;
           private int num =10;
           @Override
           public void run() {
                 while(flag ) {
                      test6();
                }
          }
          
           //线程不安全,锁定不正确,一般锁定对象
           public void test6() {
                 if(num <=0) {
                       flag = false ;
                       return;
                }
                 synchronized(this ) {
                       try {
                            Thread. sleep(500);//模拟网络延时,最后取到了0和-1
                      } catch (InterruptedException e) {
                            e.printStackTrace();
                      }
                      System. out.println(Thread.currentThread().getName() + "抢到了" + num--);
                }
     
          }
          
           //线程不安全,锁定资源不正确
           public void test5() {
                 synchronized((Integer)num ) {
                       if(num <=0) {
                             flag = false ;
                             return;
                      }
                       try {
                            Thread. sleep(500);//模拟网络延时,最后取到了0和-1
                      } catch (InterruptedException e) {
                            e.printStackTrace();
                      }
                      System. out.println(Thread.currentThread().getName() + "抢到了" + num--);
                }
     
          }
     
          
           //线程不安全,锁定范围过小
           //a b c
           public void test4() {
                 synchronized(this ) {
                       //b
                       if(num <=0) {
                             flag = false ;
                             return;
                      }
                }
                 //b
                 try {
                      Thread. sleep(500);//模拟网络延时,最后取到了0和-1
                } catch (InterruptedException e) {
                      e.printStackTrace();
                }
                System. out.println(Thread.currentThread().getName() + "抢到了" + num --);
                 //a-->1
     
          }
     
          
           //线程安全,锁定方法块
           public void test3() {
                 synchronized(this ) {
                       if(num <=0) {
                             flag = false ;
                             return;
                      }
                       try {
                            Thread. sleep(500);//模拟网络延时,最后取到了0和-1
                      } catch (InterruptedException e) {
                            e.printStackTrace();
                      }
                      System. out.println(Thread.currentThread().getName() + "抢到了" + num--);
                }
     
          }
     
          
           //线程安全,锁定方法
           public synchronized void test2() {
                 if(num <=0) {
                       flag = false ;
                       return;
                }
                 try {
                      Thread. sleep(500);//模拟网络延时,最后取到了0和-1
                } catch (InterruptedException e) {
                      e.printStackTrace();
                }
                System. out.println(Thread.currentThread().getName() + "抢到了" + num --);
     
          }
          
           //线程不安全
           public void test1() {
                 if(num <0) {
                       flag = false ;
                }
                 try {
                      Thread. sleep(500);//最后取到了0和-1
                } catch (InterruptedException e) {
                      e.printStackTrace();
                }
                System. out.println(Thread.currentThread().getName() + "抢到了" + num --);
     
          }
    }
    public class Synchronized_ {
           public static void main(String[] args) {
                W12306 w = new W12306();
                
                Thread t1 = new Thread(w, "甲" );
                Thread t2 = new Thread(w, "已" );
                Thread t3 = new Thread(w, "丁" );
                
                t2.start();
                t1.start();
                t3.start();
          }
    }
  • 相关阅读:
    机器学习之--数据构造,函数图显示
    python 用xlwt包把数据导出到excel表中
    python实现Hbase
    Hbase命令
    scrapy Formrequest用法(豆瓣登录案例)
    scrapy meta不用pipe用命令-o
    scrapy之Crawspider 腾讯招聘实战案例
    scrapy选择器归纳
    scrapy response.xpath可以提取包含字符XX的标签
    初涉.....编码__列表__字典
  • 原文地址:https://www.cnblogs.com/king-/p/4389738.html
Copyright © 2011-2022 走看看