线程的同步和异步

java 专栏收录该内容
27 篇文章 0 订阅

线程同步的概念就是给方法加锁,当其他线程调用该方法的时候只有锁解开了才可以调用,否则不能调用。使用synchronized关键字可以给方法加锁,如果方法不加锁会出现所谓的线程异步,就会有意想不到的效果。
看下面一个开启了两个线程的代码,而且是异步的

package com.li;

public class ThreadName {

    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        final ThreadName test = new ThreadName();
        new Thread (){
            public void run(){
                while(true)
                    test.myRun("吴正云");
            }
        }.start();
        new Thread (){
            public void run(){
                while(true)
                    test.myRun("周杰伦");
            } 
        }.start();

    }

        public void myRun(String name){
            for(int i=0; i<name.length(); i++)
            System.out.print(name.charAt(i));
            System.out.println();
        }
}

在输出的数据中,我们会发现有些数据很奇怪,比如“周吴”之类的等等,这就是线程异步造成的。
把代码中的一部分修改如下:

        public void myRun(String name){
            synchronized(this){
                for(int i=0; i<name.length(); i++)
                System.out.print(name.charAt(i));
            }
            System.out.println();
        }

但这种方法并不适用于静态方法
在静态方法中使用

        public  void myRun(String name){
            synchronized(ThreadName.class){
                for(int i=0; i<name.length(); i++)
                System.out.print(name.charAt(i));
            }
            System.out.println();
        }

这种方法就可以了,对于不是静态方法的也适用。

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值