导航:首页 > 编程语言 > java中如何实现线程同步

java中如何实现线程同步

发布时间:2023-06-01 22:59:19

java中线程怎么同步

1、使用线程类自带的join方法,将子线程加入到主线程,在子线程执行完之后,在执行主线程逻辑。

例如

[java]view plain

  • publicstaticvoidcallableDemo()

  • throwsInterruptedException

  • {

  • System.out.println("=========TestwithCallable=====");

  • List<Callable<Integer>>callList=newArrayList<Callable<Integer>>();

  • ExecutorServiceexec=Executors.newFixedThreadPool(2);

  • //采用匿名内部类实现

  • callList.add(newCallable<Integer>()

  • {

  • publicIntegercall()

  • throwsException

  • {

  • System.out.println("SubWorkerworker1doworkbeginat"+sdf.format(newDate()));

  • newThreadWaitDemo().doSomeWork();//做实际工作

  • System.out.println(""

  • +sdf.format(newDate()));

  • return0;

  • }

  • });

  • callList.add(newCallable<Integer>()

  • {

  • publicIntegercall()

  • throwsException

  • {

  • System.out.println("SubWorkerworker2doworkbeginat"+sdf.format(newDate()));

  • newThreadWaitDemo().doSomeWork();//做实际工作

  • System.out.println(""

  • +sdf.format(newDate()));

  • return0;

  • }

  • });

  • exec.invokeAll(callList);

  • exec.shutdown();

  • doSuperWork();

  • }

  • 5、这种过于恶心,只简单说一下方法,主线程创建一个线程List,将每个子线程保存到列表中,然后定期轮询列表中子线程状态,当所有线程都完成之后,再执行主线程逻辑
  • ⑵ JAVA中线程同步方法有哪些

    JAVA中线程同步的概念在同一个线程运行 前面的运行完在运行后面的 有先后顺序 ,简单的讲就是版像排队一样有权先后顺序。
    同步的方法有下面3种;
    1,wait方法:
    该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
    2 notify方法和notifyAll方法:
    notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。
    notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。
    3。 synchronized关键字:

    synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。
    根据项目的需求,选择有哪一种方法好一些。

    ⑶ 初学Java多线程:使用Synchronized块同步方法

    synchronized关键字有两种用法 第一种就是在《使用Synchronized关键字同步类方法》一文中所介绍的直接用在方法的定义中 另外一种就是synchronized块 我们不仅可以通过synchronized块来同步一个对象变量 也可以使用synchronized块来同步类中的静态方法和非静态方法

    synchronized块的语法如下

    public void method()

    {

    … …

    synchronized(表达式)

    {

    … …

    }

    }

    一 非静态类方法的同步

    从《使用Synchronized关键字同步类方法》一文中我们知道使用synchronized关键字来定义方法就会锁定类中所有使用synchronzied关键字定义的静态方法或非静态方法 但这并不好理解 而如果使用synchronized块来达到同样的效果 就不难理解为什么会产生这种效果了 如果想使用synchronized块来锁定类中所有的同步非静态方法 需要使用this做为synchronized块的参数传入synchronized块国 代码如下

    通过synchronized块同步非静态方法

    public class SyncBlock

    {

    public void method ()

    {

    synchronized(this) // 相当于对method 方法使用synchronized关键字

    {

    … …

    }

    }

    public void method ()

    {

    synchronized(this) // 相当于对method 方法使用synchronized关键字

    {

    … …

    }

    }

    public synchronized void method ()

    {

    … …

    }

    }

    在上面的代码中的method 和method 方法中使用了synchronized块 而第 行的method 方法仍然使用synchronized关键字来定义方法 在使用同一个SyncBlock类实例时 这三个方法只要有一个正在执行 其他两个方法就会因未获得同步锁而被阻塞 在使用synchronized块时要想达到和synchronized关键字同样的效果 必须将所有的代码都写在synchronized块中 否则 将无法使当前方法中的所有代码和其他的方法同步

    除了使用this做为synchronized块的参数外 还可以使用SyncBlock this作为synchronized块的参数来达到同样的效果

    在内类(InnerClass)的方法中使用synchronized块来时 this只表示内类 和外类(OuterClass)没有关系 但内类的非静态方法可以和外类的非静态方法同步 如在内类InnerClass中加一个method 方法 并使method 方法和SyncBlock的三个方法同步 代码如下

    使内类的非静态方法和外类的非静态方法同步

    public class SyncBlock

    {

    … …

    class InnerClass

    {

    public void method ()

    {

    synchronized(SyncBlock this)

    {

    … …

    }

    }

    }

    … …

    }

    在上面SyncBlock类的新版本中 InnerClass类的method 方法和SyncBlock类的其他三个方法同步 因此 method method method 和method 四个方法在同一时间只能有一个方法执行

    Synchronized块不管是正常执行完 还是因为程序出错而异常退出synchronized块 当前的synchronized块所持有的同步锁都会自动释放 因此 在使用synchronized块时不必担心同步锁的释放问题

    二 静态类方法的同步

    由于在调用静态方法时 对象实例不一定被创建 因此 就不能使用this来同步静态方法 而必须使用Class对象来同步静态方法 代码如下

    通过synchronized块同步静态方法

    public class StaticSyncBlock

    {

    public static void method ()

    {

    synchronized(StaticSyncBlock class)

    {

    … …

    }

    }

    public static synchronized void method ()

    {

    … …

    }

    }

    在同步静态方法时可以使用类的静态字段class来得到Class对象 在上例中method 和method 方法同时只能有一个方法执行 除了使用class字段得到Class对象外 还可以使用实例的getClass方法来得到Class对象 上例中的代码可以修改如下

    使用getClass方法得到Class对象

    public class StaticSyncBlock

    {

    public static StaticSyncBlock instance;

    public StaticSyncBlock()

    {

    instance = this;

    }

    public static void method ()

    {

    synchronized(instance getClass())

    {

    }

    }

    }

    在上面代码中通过一个public的静态instance得到一个StaticSyncBlock类的实例 并通过这个实例的getClass方法得到了Class对象(一个类的所有实例通过getClass方法得到的都是同一个Class对象 因此 调用任何一个实例的getClass方法都可以) 我们还可以通过Class对象使不同类的静态方法同步 如Test类的静态方法method和StaticSyncBlock类的两个静态方法同步 代码如下

    Test类的method方法和StaticSyncBlock类的method method 方法同步

    public class Test

    {

    public static void method()

    {

    synchronized(StaticSyncBlock class)

    {

    }

    }

    }

    lishixin/Article/program/Java/gj/201311/27374

    ⑷ Java线程同步的方法

    你们几个回答我都没看懂,同步就是synchronized,是让所有的线程执行一个代码回段之前排队,一答个一个去执行这个代码段。

    好像路边的公共厕所,一间只能一个人上。外面不管有多少人排队,里面那个人出来,才能再进去一个人。

    ⑸ java 实现线程同步的方式有哪些

    实现同步机制有两个方法:
    1、同步代码块:
    synchronized(同一个数据){} 同一个数据:就是N条线程同时访问一个数据。
    2、同步方法:
    public synchronized 数据返回类型 方法名(){}
    就是使用 synchronized 来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,同步方法的同步监视器是 this 也就是该对象的本身(这里指的对象本身有点含糊,其实就是调用该同步方法的对象)通过使用同步方法,可非常方便的将某类变成线程安全的类,具有如下特征:
    1,该类的对象可以被多个线程安全的访问。
    2,每个线程调用该对象的任意方法之后,都将得到正确的结果。
    3,每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态。
    注:synchronized关键字可以修饰方法,也可以修饰代码块,但不能修饰构造器,属性等。
    实现同步机制注意以下几点: 安全性高,性能低,在多线程用。性能高,安全性低,在单线程用。
    1,不要对线程安全类的所有方法都进行同步,只对那些会改变共享资源方法的进行同步。
    2,如果可变类有两种运行环境,当线程环境和多线程环境则应该为该可变类提供两种版本:线程安全版本和线程不安全版本(没有同步方法和同步块)。在单线程中环境中,使用线程不安全版本以保证性能,在多线程中使用线程安全版本.

    ⑹ Java类的实例化顺序是什么样的Java线程同步的方式有哪些

    引言:java是在1990年初 ,被詹姆斯•高斯林等人开发的一门面向对象的编程语言。起初,java被称为0ak,来经过发展0ak改名为java,与1995年的五月份正式向大家发布。

    一、java类的实例化顺序

    java的实例化顺序在继承没有的情况

    单独一个类的场景下,初始化顺序为依次为静态数据,继承的基类的构造函数,成员变量,被调用的构造函数。

    其中静态数据只会初始化一次。(静态数据包括静态代码块和静态变量,每个类的静态数据只会初始化一次)

    在继承的情况下

    添加两个基类,让继承父亲,父亲继承祖父。

    继承的情况就比较复杂了。由继承了基类,还将往上回溯,递归地调用基类的无参构造方法。

    在我们的例子中,在初始化静态数据后,会先往上追溯,调用父的默认构造方法,此时再往上追溯到爷爷的默认构造方法。


    无论是java还是什么别的东西他都体现了现代社会与信息技术的不断发展,人们在进行进行技术开发时也有了越来越多的方法。程序类的工作也有了更为快捷的方法,这为信息技术的发展也提供了更好的发展方法

    阅读全文

    与java中如何实现线程同步相关的资料

    热点内容
    宝马frm数据修复是什么用 浏览:57
    文件放进u盘然后打不开 浏览:861
    哪些城市小学开编程课 浏览:550
    被窝电影0855影院 浏览:793
    大话西游2粤语版高清 浏览:146
    索八原车导航升级 浏览:35
    iphone5接听需要密码吗 浏览:673
    3开头的10位qq号 浏览:397
    重生之刘涛怀孕 浏览:984
    大数据引领慢病 浏览:572
    盒马生鲜app怎么买 浏览:511
    苹果tumblr教程 浏览:48
    sm爱好者都用哪些APP 浏览:311
    不可能的世界txt 浏览:48
    苹果6s手机摔掉漆 浏览:449
    男主囚禁女主灭了她的国家 浏览:841
    男人看的电影网站 浏览:390
    车展推广app有哪些 浏览:787
    云学app哪个好 浏览:498
    因为什么对编程感兴趣 浏览:161

    友情链接