文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java编程语言中注意线程安全和同步是怎样的

2023-06-17 16:12

关注

这篇文章给大家介绍Java编程语言中注意线程安全和同步是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Java编程语言对于使用者来说是一个相当简单的编程语言。但是在使用的时候还是需要我们不断注意相关问题,下面我们就来熟悉下Java编程语言的线程安全问题和信息同步。

就其自身来说,并发编程是一种技术,提供了操作的同时执行,不论是在单一系统上还是分布在大量系统上。这类操作实际是一些指令顺序,例如单独某个***任务的子任务,这类操作能够并行执行,或者是作为线程,或者是作为进程。线程和进程之间的本质区别在于:进程通常是独立的(例如独立的地址空间),所以只能通过系统提供的进程间通信机制进行交互,而线程通常共享单一进程的状态信息,能够直接共享系统资源和内存中的对象。

可以使用下面两种方法之一,通过多个进程来实现并发。***种方法是在同一个处理器上运行进程,由操作系统处理进程之间的上下文环境切换。(可以理解,这种切换要比同一进程内多线程之间的上下文环境切换更慢。)第二种方法是构建大规模的并行和复杂的分布式系统,在不同的物理处理器上运行多个进程。

从内建支持的角度来说,Java编程语言通过线程提供并发编程;每个 JVM 都能支持许多线程同时执行。可以用以下两种方法之一在Java编程语言中创建线程:

继承 java.lang.Thread 类。在这种情况下,已经重写的子类的 run() 方法必须包含实现线程运行时行为的代码。要执行这个代码,需要实例化子类对象,然后调用对象的 start() 方法,这样就可以在内部执行 run() 方法了。

创建 Runnable 接口的定制实现。这个接口只包含一个 run() 方法,在这个方法中,要放置应用程序代码。要执行这个代码,需要实例化实现类的对象,然后在创建新 Thread 时,把对象作为构造函数的参数传入。然后调用新创建的线程对象的 start() 方法,开始执行控制的新线程。

线程安全性和同步

如果Java编程语言对象中的某个方法能够安全地运行在多线程环境中,那么就称该方法是 线程安全的。要获得这种安全性,必须有一种机制,通过该机制,运行同一方法的多个线程就能够同步其操作,这样,在访问相同的对象或代码行时,就会只允许一个线程被处理。这种同步要求线程使用叫作 信号 的对象彼此进行沟通。

有一种类型的信号叫作 互斥信号 或 互斥体。顾名思义,这个信号对象的拥有权是互斥的,也就是说,在任意指定时间,只有一个线程能够拥有互斥体。其他想获得所有权的线程会被阻塞,它们必须等待,直到拥有互斥体的线程释放互斥体。如果多个线程按顺序排队等候同一互斥体,那么在当前拥有者释放它的时候,只有一个等候线程能够得到它;其他线程将继续阻塞。

在 1970 年代初,C.A.R. Hoare 和其他人共同开发了一个叫作 监视器 的概念。一个 监视器 就是一个代码主体,它的访问受到互斥体的保护。任何想执行这个代码的线程,都必须在代码块顶部得到关联的互斥体,然后在底部再释放它。因为在指定时间只有一个线程能够拥有互斥体,所以这就有效地保证了只有拥有它的线程才能执行监视器的代码块。(受保护的代码不需要相邻 —— 例如,Java编程语言中的每个对象都有一个与之关联的监视器。)

任何想在 Java编程语言中进行线程编程的开发人员,都会立即把上面的内容当成 synchronized 关键字所带来的效果。可以确保包含在 synchronized 块中的 Java 代码在指定时间只被一个线程执行。在内部,可以由运行时将 synchronized 关键字转换成某一种情况:所有的竞争线程都试图获得与它们(指线程)正在操作的对象实例关联的那个(惟一的一个)互斥体。成功得到互斥体的线程将运行代码,然后在退出 synchronized 块时释放互斥体。

等候和通知

wait/notify 构造在 Java编程语言的线程间通信机制中也扮演了重要的角色。基本的想法是:一个线程需要的某个条件可以由另外一个线程促成。这样,条件的 wait 就可以得到满足。一旦条件为真,那么引发条件的线程就会 notify 等候线程苏醒,并从中止的地方继续进行。

wait/notify 机制要比 synchronized 机制更难理解和判断。要想判断出使用 wait/notify 的方法的行为逻辑,就要求判断出使用它的所有方法的逻辑。一次判断一个方法,把该方法和其他方法隔离开,是对整体系统行为得出错误结论的可靠方式。显然,这样做的复杂性会随着要判断的方法的数量增长而迅速提高。

关于Java编程语言中注意线程安全和同步是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯