• 并发编程


    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
  • 相关阅读:
    写代码的方法与思考
    改变文件上传input file类型的外观
    关于HTML Button点击自动刷新页面的问题解决
    使用 git push 出现error setting certificate verify locations问题记录
    flex使用学习
    jQuery.fn.extend()
    jQuery extend()
    作用域
    私有变量
    模仿块级作用域
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12284909.html
Copyright © 2020-2023  润新知