首页 > 编程知识 正文

线程间同步有几种方式,群同步概念

时间:2023-05-05 12:54:55 阅读:162496 作者:2735

一.线程同步概念

大多数单线程代码放在多线程环境中容易出现线程安全问题。

二.线程安全问题

模拟取钱过程演示线程安全问题。

一般取钱流程:

用户输入账户、密码,系统判断用户的账户、密码是否一致。 用户输入取款金额。 系统判断账户余额是否大于取款金额。 如果余额大于取款金额,取款成功; 如果余额小于取款金额,取款将失败。

在模拟过程中模拟了以下三个步骤,没有模拟账户密码验证过程。

三.使用同步码块

为了解决线程安全问题,Java多线程支持部署了同步监视器来解决此问题,并使用同步监视器的通用性

方法是同步代码块。

同步代码块的语法格式如下。

同步(obj ) {

//同步代码块

}

obj被称为同步监视器(锁定对象),任何线程都必须先获得obj的锁定,然后才能进入下一个同步代码块。没有其他线程

当法获得锁时,同步代码块也会执行。 这种做法符合“上锁-修改-解锁”的逻辑。 锁定对象可以是任意对象,

但是,必须保证是同一对象

一次只能有一个线程获取同步监视器的锁定。 同步代码块执行完成后,线程将释放同步监视器

锁定步进监视器

四.同步方法

除了代码块同步外,Java多线程安全支持还提供了使用synchronized关键字进行同步的方法

如果修饰某个方法,该方法就称为同步方法。 不需要明确表示synchronized限定的实例方法(非静态方法)

表达式指定了同步监视器,同步方法的同步监视器是一个this,也就是调用方法的对象。

五.同步锁(锁)。

从Java5开始,Java提供了更强大的线程同步机制——,通过显式定义同步锁定对象实现同步

在这种机制中,同步锁通过Lock对象起作用。

与同步方法和同步代码块相比,Lock提供了更广泛的锁定操作,而Lock提供了更灵活的节点

结构可以具有很大不同的属性。

Lock是一种控制多个线程对共享资源的访问的工具。 通常,锁提供对共享资源的独占访问,只能一次使用

线程锁定Lock对象,并且线程必须先获取Lock对象才能访问共享资源。

在实现线程安全的控制中,经常使用ReentrantLock (可重新锁定)。 使用此Lock对象可以显式添加

锁定,解锁。

六.死锁

如果两个线程等待对方释放同步监视器,则会发生死锁,Java虚拟机将不会被监视,也不会采取措施

因为存在死锁的情况,所以应该采取措施避免在多线程编程时发生死锁。 发生死锁时,整个程序什么都不会发生

异常。 没有任何提示。 但是,所有线程都处于阻塞状态,无法继续。

如果系统有多个同步监视器,则容易发生死锁。

七. wait ()、notify/notifyAll ) )。

1、wait ()、notify/notifyAll ) )方法是Object的final方法,无法重写。

2、wait ) )阻塞当前线程,以必须先获得锁为前提,一般与synchronized关键词结合使用。 即,一般来说

同步的同步代码块使用wait (,notify/notifyAll )方法。

3、wait ()、notify/notifyAll )在synchronized代码块中执行,因此当前线程一定会获得锁。 本线

程wait ) )方法会解除当前的锁定,然后释放CPU,进入等待状态。 仅执行notify/notifyAll ()

行启动一个或多个等待的线程,并继续执行,直到执行同步层代

在代码块的代码或中间遇到wait (),再次解除锁定。 也就是说,执行notify/notifyAll ()只会唤醒沉睡的线

所以,不会马上解除锁定。 解锁请看代码块的具体执行情况。 所以在编程中,我尽量使用

在notify/notifyAll () )后立即退出关键节并调用其他线程。

4、wait ) )需要被try…catch包围。

5、通告和等待的顺序不能错。 如果a线程先执行notify方法,b线程执行wait方法,则没有b线程

法律觉醒了。

6、通告与通告全部的区别

notify方法只触发一个线程(等待对象),然后开始执行该线程。 所以,如果多个线程等待一对

如所示,此方法只启动一个线程,选择哪个线程取决于操作系统的多线程管理实现。

notifyAll将启动所有等待对象的线程,尽管首先处理的线程取决于操作系统的实现。

如果当前需要多个线程唤醒,建议使用notifyAll方法

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。