java中线程同步的几种方法

坦白说,同步线程的方法只有几种,但是如果用得好,可以避免很多麻烦。

我们先来说说最重要的同步方法。
去年我们跑了一个高度统一的项目,靠同步关键词来响应流量。
但在3 000级并发以下,由于锁粒度较粗,同步方法会有点慢。
还有一点是代码块的同步更加灵活,但是请注意,这并不是万能的。
有时类锁定具有更好的性能。
还有一个细节非常重要。
例如,去年我们陷入了一个陷阱,认为波动性可以保证原子性,但发现它只是禁止指令重排序,计数器仍然必须锁定。

一开始我以为转动原子是万能的,但后来我意识到这是错误的。
当并发数超过千万时,其性能优势就不那么明显了。
说实话,这是相当混乱的,尤其是AtomicInteger源码中使用了CAS,在高并发情况下会造成一定的性能下降。

最后,快速提醒:不要将局部变量与 ThreadLocal 混淆。
虽然ThreadLocal可以隔离线程,但是内存回收是一个问题。
去年有一个项目,因为导致了内存泄漏。
你应该使用显式锁或者原子类,除非你确信每个线程都能及时清理自己的ThreadLocal。

线程同步的方式有哪几种(线程同步的方式有哪几种c)

说白了,在Windows 1 1 中选择这四种流同步方式之一,需要根据具体情况而定。
事件适用于异步通知和优先级管理。
去年我们做的一个项目中,使用事件来触发消息队列,每天可以处理大约3 000个请求;信号量需要控制并发量。
例如,数据库连接团队使用它进行限流,但要注意冻结动画问题。
关键部分简单粗暴,直接锁定代码块。
去年团队重构时发现,用它来控制共享内存读写,响应速度比mutex快1 5 %,但是不要用太多,否则CPU会太闲。
说实话,这很令人困惑。
起初我以为互斥锁和关键部分没有区别。
然后我发现互斥量可以在进程之间同步。
很多人不重视这一点。

互斥锁是一个主键,但创建和销毁它的成本很高。
如果在频繁切换的代码中使用,会降低整体性能。
等等,还有别的事。
临界区不能用于等待,但隐喻可以。
这个细节值得一试。
最好先画一个时序图,看看线程是否正在“拉动”资源或“排队”访问。
选择正确的工具可以节省大量调试时间。

说一说超线程/同步多线程(HT/SMT)技术那些事儿

2 02 3 年 我的朋友
超线程/SMT是一种提高CPU效率的技术。
通过虚拟内核实现多线程并行。

原则是填补闲置资源。
单线程指令之间可能存在依赖性。
执行端口可以为空。

SMT 将不同的线程指令混合在一起。
填写空闲端口。
提高资源利用率。

例如,同时运行两个任务。
事实证明,可以有7 N个循环。
SMT 后可能需要 6 N 个周期。
效率提高 1 6 .7 %。

理论上,虚拟核心越多越好。
但实际回报将会递减。
因为任务冲突会增加。

与物理多核相比有优势。
低成本。
资源再利用。
逻辑核心增加的面积较小。
例如,Pentium 4 只需要 5 % 的面积即可添加超线程。
可以提高多线程性能1 5 -3 0%。

适用于多种场景。
在多任务负载下,流程得到显着改善。
适用于服务器和桌面。

但是有一个价格。
单线程性能会下降。
因为维护费用。
协调多个线程存在延迟。

资源冲突问题。
如果线程竞争相同的资源。
比如共享L3 缓存。
缓存命中率降低。
导致频繁的内存访问。
相反,它降低了整体效率。

线程安全问题。
不完全隔离存在危险。
例如,英特尔 Skylake 就曾出现过漏洞。

能源消耗增加。
牺牲单核功耗比。
导致静态和泄漏功耗增加。
移动设备很少使用SMT。

配置不同。
无 SMT 的磁芯。
比如Intel Atom系列。
后端资源接近饱和。
SMT 的收益低于管理费用。
自 Silvermont 架构以来,SMT 已被弃用。

SMT2 非常流行。
常用于桌面和服务器。
比如Intel Core i7 和AMD Zen系列。
任务冲突更少,性价比更高。

SMT4 /SMT8 用于特定场景。
例如IBM Power、Oracle SPARC。
需要处理高并发计算。
但这依赖于任务的低冲突性质。

使用建议。
普通用户无需担心这一点。
操作系统会优化调度。
大多数情况下,它可以提高多任务处理效率。

可以禁用单核性能跟踪。
比如游戏或者超频。
少于4 核的设备不需要激活。

在服务器脚本中要小心。
云服务器和HPC服务器经常关闭。
避免资源冲突和安全风险。

区分逻辑核心和物理核心。
任务管理器没有根本性的变化。
操作系统平均分配任务。
CPU 为 8 核 1 6 线程。
每个物理核心 2 个逻辑核心。
能够独立执行任务。
连接各个逻辑核心。
所有这些都占用同等的重要物理资源。
概括。
SMT 优化资源使用。
对于多任务场景来说具有成本效益。
但必须权衡能源消耗的矛盾和成本。
选择如果您将根据需要激活它。
应仔细评估服务器场景。
没关系。