zoukankan      html  css  js  c++  java
  • 并发编程

    Synchronized 修饰类中的静态方法,与非静态方法。

    话不多说直接上代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public class MultiThread{

    private static int num=0;

    public synchronized void printNum(String tag){
    try{
    if(tag.equals("a")){

    num=100;
    System.out.println("tag a,set num over");
    Thread.sleep(1000);
    }else{
    num=200;
    System.out.println("tag b,set num over");
    }
    System.out.println("tag"+tag+",num="+num);
    }catch(InterruptedException e){
    e.printStackTrace();
    }
    }

    public static void main(String[] args){
    final MultiThread m1=new MultiThread();
    final MultiThread m2=new MultiThread();

    Thread t1=new Thread(new Runnable(){
    public void run(){
    m1.printNum("a");
    }
    大专栏  并发编程 });

    Thread t2=new Thread(new Runnable(){
    public void run(){
    m2.printNum("b");
    }
    });

    t1.start();
    t2.start();
    }
    }

    程序输出的结果:

    1
    2
    3
    4
    tag a,set num over
    tag b,set num over
    tagb,num=200
    taga,num=200

    其实此时程序会出现两种结果的输出:

    1
    2
    3
    4
    tag b,set num over
    tag a,set num over
    tagb,num=100
    taga,num=100

    1
    2
    3
    4
    tag b,set num over
    tag a,set num over
    tagb,num=200
    taga,num=200

    这是因为int num 被static 修饰,当线程t1和t2的执行顺序不同的时候就会出现这两种结果。此时synchronized是否修饰都不影响程序的执行效果,去掉static 关键字再来观察。

    1
    2
    3
    4
    tag a,set num over
    tag b,set num over
    tagb,num=200
    taga,num=100

    两次输出的结果并不相同,各自输出了各自的预期输出值。线程之间并没有受到干扰。再synchronzied关键字前加上static ,这样便成为了类锁,整个他t1,t2中的printnum方法会存在抢占,会先执行完其一,再执行另一个,看输出结果。

    1
    2
    3
    4
    tag b,set num over
    tagb,num=200
    tag a,set num over
    taga,num=100
  • 相关阅读:
    安卓下拉,刷新
    Android继承AppCompatActivity实现全屏设置
    端口被占用:android studio 虚拟机adb.exe已停止工作的处理
    学习笔记
    github上的文件比对
    框架:提供一定能力的小段程序
    游戏中实现粒子碰撞,纯java
    一个仿3D的平面游戏页面
    多媒体流处理,安卓进阶之路
    空间主页播放任意FLV格式视频方法
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12286277.html
Copyright © 2011-2022 走看看