线程的同步和异步

    xiaoxiao2021-03-25  140

    线程同步的概念就是给方法加锁,当其他线程调用该方法的时候只有锁解开了才可以调用,否则不能调用。使用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(); }

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

    转载请注明原文地址: https://ju.6miu.com/read-7324.html

    最新回复(0)