Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Java如何实现多线程安全集合?ConcurrentHashMap原理分析_创想鸟

Java如何实现多线程安全集合?ConcurrentHashMap原理分析

在java中,实现线程安全集合的首选方式是使用java.util.concurrent包中的并发集合类。1. concurrenthashmap通过分段锁(jdk 7及之前)或cas+synchronized(jdk 8及以上)机制提供高并发性能,避免了全局锁带来的性能瓶颈;2. copyonwritearraylist适用于读多写少场景,通过写时复制保证线程安全;3. concurrentlinkedqueue和arrayblockingqueue分别适用于无界非阻塞和有界阻塞队列需求。相较于hashtable和collections.synchronizedmap的粗粒度锁机制,concurrenthashmap通过细粒度锁和无锁读操作显著提升了并发效率。其get方法利用volatile变量和不可变node对象实现无需加锁的线程安全读取。put操作则结合cas尝试无锁插入,并在冲突时锁定单个桶节点以支持并发修改。扩容时采用多线程协作迁移数据的方式,进一步减少了对整体性能的影响。因此,在并发编程中应优先选用这些专为并发优化的集合类。

Java如何实现多线程安全集合?ConcurrentHashMap原理分析

在Java中,要实现多线程安全的集合,最直接且高效的方式是使用java.util.concurrent包下提供的并发集合类。这些类经过精心设计,能够在高并发场景下提供优秀的性能和线程安全性,其中ConcurrentHashMap就是典范。当然,你也可以通过Collections.synchronizedMap()等方式对现有集合进行包装,但其并发性能通常不如专门的并发集合。

Java如何实现多线程安全集合?ConcurrentHashMap原理分析

解决方案

当我们需要一个线程安全的Map时,ConcurrentHashMap是首选。它通过精细的锁控制(而非全局锁)实现了高并发访问。对于列表,CopyOnWriteArrayList在读多写少场景下表现出色,因为它在写入时会复制底层数组,保证了读操作的无锁化。而对于队列,ConcurrentLinkedQueue和ArrayBlockingQueue等则提供了不同的并发队列实现,前者是无界非阻塞的,后者是有界阻塞的。选择哪种取决于具体的业务需求和并发模式。通常,优先考虑java.util.concurrent包中的类,它们在设计上就考虑到了并发问题,且性能经过了高度优化。

ConcurrentHashMap为什么比HashTable和Collections.synchronizedMap更高效?

这其实是个很有趣的问题,它揭示了并发编程中锁粒度对性能的决定性影响。HashTable和通过Collections.synchronizedMap包装的HashMap,它们实现线程安全的方式是简单粗暴的:在几乎所有公共方法上都加上了synchronized关键字。这意味着,无论你是在读数据还是写数据,只要有一个线程在操作这个Map,整个Map就被锁住了,其他所有试图访问的线程都得排队等待。这就像一家餐厅,只有一个服务员,每次只能服务一位顾客,效率自然低下。

立即学习“Java免费学习笔记(深入)”;

Java如何实现多线程安全集合?ConcurrentHashMap原理分析

ConcurrentHashMap则完全不同。在JDK 7及之前的版本,它采用了“分段锁”(Segment Lock)的机制,将整个Map划分为若干个Segment,每个Segment都是一个独立的HashTable。当一个线程修改某个Segment时,只会锁住这个Segment,其他线程仍然可以访问其他Segment。这就大大提升了并发度。

而到了JDK 8,ConcurrentHashMap的实现进一步优化,取消了Segment的概念,转而采用了“CAS(Compare-And-Swap)+ synchronized”的策略。它的核心思想是:

Java如何实现多线程安全集合?ConcurrentHashMap原理分析无锁读操作: get操作通常不需要加锁,因为它利用了volatile和内存屏障的特性,保证了读取到的数据是最新的。CAS操作: 对于一些简单的修改操作,例如在桶(bucket)为空时尝试放入第一个节点,ConcurrentHashMap会尝试使用CAS操作来原子性地更新。如果成功,则无需加锁。细粒度锁: 只有当发生哈希冲突,需要修改链表或红黑树结构时,才会对链表或红黑树的头节点进行synchronized锁定。这意味着,即使在同一个桶内,只要不是修改同一个链表或树的结构,不同的线程也可以同时进行操作。当链表过长时,还会转换为红黑树以优化查找性能。

这种设计使得ConcurrentHashMap在大多数情况下都能实现很高的并发度,因为大部分操作都不需要等待全局锁,甚至不需要等待桶级别的锁,只有在真正需要修改共享结构时才加锁,而且锁的粒度非常小。

ConcurrentHashMap的get方法是如何实现线程安全的?

ConcurrentHashMap的get方法实现线程安全,但又无需加锁,这得益于Java内存模型(JMM)中的volatile关键字和其内部数据结构的巧妙设计。

喵记多 喵记多

喵记多 – 自带助理的 AI 笔记

喵记多 27 查看详情 喵记多

ConcurrentHashMap的底层是一个Node数组,这个数组被volatile修饰。volatile确保了两点:

可见性: 当一个线程修改了Node数组中的某个元素(比如替换了一个Node对象),这个修改会立即对所有其他线程可见。有序性: 编译器和处理器不会对volatile变量的操作进行重排序,保证了操作的顺序性。

在get操作中:

它首先会读取volatile修饰的table数组,确保获取到的是最新的数组引用。接着,根据键的哈希值定位到对应的桶(Node数组的索引)。然后,它遍历该桶中的链表或红黑树来查找目标键值对。

这里的关键在于,Node对象本身(存储键值对)一旦被创建并放入桶中,其内部的键和值通常是不可变的(final修饰)。即使需要更新某个键的值,ConcurrentHashMap也可能通过创建新的Node并替换旧Node的方式来实现,或者利用CAS操作原子性地更新Node内部的值。由于get操作只是读取已经存在的Node及其内容,而volatile保证了Node数组的可见性,使得get总是能看到最新的Node引用。在遍历链表或红黑树时,由于Node之间的引用也是通过volatile或CAS保证了可见性和原子性,因此get操作可以在没有显式锁的情况下安全地进行。它避免了读写冲突,因为读操作不会阻塞写操作,写操作也不会阻塞读操作(除非写操作正在改变整个桶的结构,比如链表转红黑树,但即便如此,get也只是读取旧的引用,最终会看到最新的状态)。

ConcurrentHashMap在put操作中如何处理并发冲突和扩容?

ConcurrentHashMap的put操作是其并发性能的核心体现,它巧妙地结合了CAS和synchronized来处理并发冲突和扩容。

处理并发冲突:当一个线程调用put方法时:

计算哈希值: 首先根据键计算哈希值,并确定目标桶(Node数组的索引)。检查桶状态:如果目标桶为空,put操作会尝试使用CAS来放置第一个Node。如果CAS成功,操作完成,无需加锁。如果目标桶不为空,说明该桶已经有元素。此时,put操作会尝试对该桶的头节点进行synchronized锁定。这个锁是针对单个桶的,而不是整个Map。遍历与插入/更新:在获取到桶锁后,线程会遍历链表或红黑树。如果找到相同的键,则更新其值。这可能涉及CAS操作(如果Node支持原子更新)或在锁内直接修改。如果未找到相同键,则将新的Node插入到链表末尾或红黑树中。链表转红黑树: 如果某个桶的链表长度超过了TREEIFY_THRESHOLD(默认为8),ConcurrentHashMap会将该链表转换为红黑树,以优化查找性能。这个转换过程也是在桶锁的保护下进行的。

通过这种方式,ConcurrentHashMap避免了对整个Map的锁定,允许多个线程同时修改不同桶中的元素,大大提高了并发度。只有当多个线程恰好要修改同一个桶时,才需要竞争同一个桶锁。

处理扩容(Resizing):ConcurrentHashMap的扩容机制也设计得非常巧妙,支持并发扩容:

触发扩容: 当Map中的元素数量达到一定阈值(capacity * loadFactor)时,会触发扩容。创建新表: ConcurrentHashMap会创建一个两倍于当前容量的新Node数组。并发迁移: 扩容并不是由一个线程独自完成的,而是可以由多个线程协助完成。当一个线程发现Map正在扩容时(通过检查桶中是否有ForwardingNode标记),它会加入到迁移工作中。每个线程负责迁移一部分桶。它会从旧表的末尾开始,向头部遍历,每次处理一个或多个桶。在迁移每个桶时,该线程会锁定当前桶的头节点,然后将该桶中的所有Node重新哈希并复制到新表中对应的位置。迁移完成后,旧表中的对应桶会被放置一个ForwardingNode,表示该桶的数据已经迁移到新表,并指向新表。CAS更新表引用: 当所有桶都迁移完成后,ConcurrentHashMap会使用CAS操作原子性地将table引用指向新的Node数组。

这种并发迁移的设计,使得扩容过程不会长时间阻塞整个Map的读写操作,进一步提升了ConcurrentHashMap在高并发场景下的可用性和性能。它巧妙地利用了CAS和细粒度锁,将一个看似复杂的全局操作分解为多个可以并行执行的小任务。

以上就是Java如何实现多线程安全集合?ConcurrentHashMap原理分析的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/345900.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
mysql怎么设置root密码
上一篇 2025年11月5日 20:21:58
我的世界大玻璃怎么合成 大块玻璃合成方法介绍
下一篇 2025年11月5日 20:21:59

相关推荐

  • 小红书怎么查注册日期?小红书怎么查注册日期和时间

    小红书怎么查注册日期?小红书怎么查注册日期和时间小红书怎么查注册日期?小红书怎么查注册日期和时间小红书怎么查注册日期?小红书怎么查注册日期和时间小红书怎么查注册日期?小红书怎么查注册日期和时间

    随着社交媒体的不断发展,小红书已经成为了一个热门的分享平台。在这个平台上,我们可以发现各种有趣的内容,结交志同道合的朋友,甚至还能找到生活中的灵感。你是否好奇过自己是在什么时间注册的小红书呢?今天,就让我来带你了解一下,如何在小红书上查找注册日期。 一、登录小红书账号 当然是要确保你已经成功注册了小…

    2026年9月25日 • 用户投稿
    000
  • Debian Tomcat日志中的并发问题如何解决

    Debian Tomcat日志中的并发问题如何解决Debian Tomcat日志中的并发问题如何解决Debian Tomcat日志中的并发问题如何解决Debian Tomcat日志中的并发问题如何解决

    本文探讨如何解决Debian系统下Tomcat服务器的并发问题。 高并发访问可能导致Tomcat性能下降甚至崩溃,本文提供多种优化策略: 一、调整Tomcat配置: 线程池优化: 修改conf/server.xml文件中的Connector元素,调整maxThreads(最大线程数)、minSpar…

    2026年9月25日 • 用户投稿
    100
  • 240水冷能压住i7级别的CPU吗?

    240水冷能压住i7级别的CPU吗?240水冷能压住i7级别的CPU吗?240水冷能压住i7级别的CPU吗?240水冷能压住i7级别的CPU吗?

    240水冷能压住i7级别CPU,具体取决于型号和使用场景。对于第13、14代i7如i7-13700/14700,日常使用和游戏负载下,主流240水冷设计散热功耗普遍超200W,配合合理机箱风道可稳定控温;但若进行超频或运行AIDA64、Prime95等高负载任务,尤其是i7-14700K这类带“K”…

    2026年9月25日 • 用户投稿
    000
  • 为什么苹果手机副卡收不到短信

    为什么苹果手机副卡收不到短信为什么苹果手机副卡收不到短信为什么苹果手机副卡收不到短信为什么苹果手机副卡收不到短信

    苹果手机副卡无法收到短信的原因如下:副卡未激活iMessage 未启用蜂窝数据未打开短信中心设置不正确SIM 卡损坏网络拥塞运营商限制 为什么苹果手机副卡收不到短信? 苹果手机持有者在使用副卡时,可能会遇到收不到短信的问题。以下是一些常见原因: 1. 副卡未激活 检查您的副卡是否已激活。未激活的副卡…

    2026年9月25日 • 用户投稿
    000
  • 为什么有些硬件评测中的噪音数据与实际感受不符?

    为什么有些硬件评测中的噪音数据与实际感受不符?为什么有些硬件评测中的噪音数据与实际感受不符?为什么有些硬件评测中的噪音数据与实际感受不符?为什么有些硬件评测中的噪音数据与实际感受不符?

    噪音数据与实际感受不符因分贝值忽略频率分布、噪音类型、环境背景及主观差异,评测环境与真实场景不同,需综合考量测试方法与个体感知差异。 硬件评测中的噪音数据与实际感受不符,这很常见。原因在于,数据只是一个冰冷的数字,它无法完全捕捉人耳对噪音的感知复杂性,以及环境因素的影响。 数据是数据,感受是感受,两…

    2026年9月25日 • 用户投稿
    100
  • 一帧能玩 三帧电竞! 博主测试各主流显卡运行《战地6》帧数

    一帧能玩 三帧电竞! 博主测试各主流显卡运行《战地6》帧数一帧能玩 三帧电竞! 博主测试各主流显卡运行《战地6》帧数一帧能玩 三帧电竞! 博主测试各主流显卡运行《战地6》帧数一帧能玩 三帧电竞! 博主测试各主流显卡运行《战地6》帧数

    近日,YouTube频道54 FPS对《战地风云6》在多款主流显卡上的运行表现进行了实测。测试平台搭载了AMD Ryzen 5 7600处理器与32GB内存,确保CPU不会成为性能瓶颈。 测试数据如下: GTX 1650(1080p,低画质)— 平均43帧;GTX 1650(1080p,低画质 + …

    2026年9月25日 • 用户投稿
    100
  • 为什么苹果手机锁屏了还会亮

    为什么苹果手机锁屏了还会亮为什么苹果手机锁屏了还会亮为什么苹果手机锁屏了还会亮为什么苹果手机锁屏了还会亮

    苹果手机锁屏后仍会亮起的原因包括:息屏显示、抬腕唤醒、轻点唤醒、附近设备解锁和背景应用刷新。为了防止这种情况,用户可以禁用以下功能:息屏显示、抬腕唤醒、轻点唤醒、附近设备解锁和背景应用刷新。 苹果手机锁屏后为什么仍然会亮? 苹果手机锁屏后仍然会亮通常是因为以下原因之一: 1. 息屏显示功能 息屏显示…

    2026年9月25日 • 用户投稿
    200
  • 为什么苹果手机拍出来的照片发黄

    为什么苹果手机拍出来的照片发黄为什么苹果手机拍出来的照片发黄为什么苹果手机拍出来的照片发黄为什么苹果手机拍出来的照片发黄

    苹果手机照片发黄的原因有硬件因素(镜头镀膜氧化、色温传感器偏差)、软件因素(图像增强算法、色温设置)、环境因素(灯光环境、曝光不足)等。可通过校准色温、使用自然光、手动调整设置、使用第三方相机应用、后期处理等办法解决。 苹果手机照片发黄的原因 一、硬件因素 镜头镀膜氧化:随着时间的推移,镜头镀膜会氧…

    2026年9月24日 • 用户投稿
    100
  • 为什么有些SSD参数漂亮但实际体验却令人失望?

    为什么有些SSD参数漂亮但实际体验却令人失望?为什么有些SSD参数漂亮但实际体验却令人失望?为什么有些SSD参数漂亮但实际体验却令人失望?为什么有些SSD参数漂亮但实际体验却令人失望?

    SSD实际体验不佳的核心在于纸面参数仅反映理想条件下的峰值性能,而真实使用中受主控、闪存类型、SLC缓存耗尽、DRAM缓存缺失、固件优化不足及散热不良等因素影响,导致持续写入速度骤降、系统卡顿等问题。 很多时候,我们看着SSD产品页面上那些漂亮的顺序读写速度,比如几千MB/s,或者惊人的IOPS,心…

    2026年9月24日 • 用户投稿
    100
  • VSCode 怎样通过快捷键快速折叠所有代码块 VSCode 快速折叠所有代码块的快捷键方法​

    在vscode中一键折叠所有代码的快捷键是ctrl + k后按ctrl + 0(mac为cmd + k再按cmd + 0),该操作可将函数、类、条件语句等所有可折叠区域全部收起,帮助快速概览文件结构、提升阅读与定位效率;此外,还可使用ctrl + shift + [折叠当前代码块、ctrl + k,…

    2026年9月24日
    100
  • LINUX查看硬件信息的命令_LINUX查看CPU内存硬盘等硬件信息汇总

    LINUX查看硬件信息的命令_LINUX查看CPU内存硬盘等硬件信息汇总LINUX查看硬件信息的命令_LINUX查看CPU内存硬盘等硬件信息汇总LINUX查看硬件信息的命令_LINUX查看CPU内存硬盘等硬件信息汇总LINUX查看硬件信息的命令_LINUX查看CPU内存硬盘等硬件信息汇总

    可通过命令行获取CPU、内存、硬盘等硬件信息:1. 使用lscpu、cat /proc/cpuinfo和dmidecode -t processor查看CPU型号、核心数及频率;2. 通过free -h、cat /proc/meminfo和dmidecode -t memory确认内存容量与类型;3…

    2026年9月24日 • 用户投稿
    300
  • MAC怎么查看电脑配置信息_Mac硬件配置与系统信息查看方法

    MAC怎么查看电脑配置信息_Mac硬件配置与系统信息查看方法MAC怎么查看电脑配置信息_Mac硬件配置与系统信息查看方法MAC怎么查看电脑配置信息_Mac硬件配置与系统信息查看方法MAC怎么查看电脑配置信息_Mac硬件配置与系统信息查看方法

    首先通过“关于本机”查看Mac基础配置,包括系统版本、处理器和内存;再进入“系统信息”获取硬件、网络等详细数据;最后可用终端命令精准查询序列号、芯片架构及系统版本。 如果您想了解您的Mac电脑的具体硬件配置和系统信息,可以通过多种内置工具快速获取。这些信息包括处理器型号、内存大小、存储容量、显卡详情…

    2026年9月24日 • 用户投稿
    100
  • win10玩游戏掉帧严重怎么办_提升Win10游戏性能减少掉帧的优化设置

    win10玩游戏掉帧严重怎么办_提升Win10游戏性能减少掉帧的优化设置win10玩游戏掉帧严重怎么办_提升Win10游戏性能减少掉帧的优化设置win10玩游戏掉帧严重怎么办_提升Win10游戏性能减少掉帧的优化设置win10玩游戏掉帧严重怎么办_提升Win10游戏性能减少掉帧的优化设置

    首先调整电源模式至高性能,再为游戏指定独立显卡并更新显卡驱动,同时关闭后台程序与Xbox Game Bar,最后降低游戏画质设置以提升帧数稳定性。 如果您在运行游戏时遇到画面卡顿、帧数急剧下降的情况,这通常意味着系统资源分配不足或软硬件设置未针对游戏进行优化。以下是多种可以尝试的解决方案。 本文运行…

    2026年9月24日 • 用户投稿
    100
  • Java中实现跨类和函数共享变量的策略

    Java中实现跨类和函数共享变量的策略Java中实现跨类和函数共享变量的策略Java中实现跨类和函数共享变量的策略Java中实现跨类和函数共享变量的策略

    本文深入探讨了在Java中实现跨类和函数共享变量的有效策略。通过利用public static关键字,可以在不创建对象实例的情况下,使变量在整个应用程序中具备全局可访问性。文章将通过示例代码演示其使用方法,并提供关于此模式的注意事项与最佳实践,以帮助开发者理解其优势和潜在风险。 核心概念:publi…

    2026年9月24日 • 用户投稿
    100
  • Chrome浏览器怎么看视频出现绿屏_视频播放绿屏问题的解决方案

    Chrome浏览器怎么看视频出现绿屏_视频播放绿屏问题的解决方案Chrome浏览器怎么看视频出现绿屏_视频播放绿屏问题的解决方案Chrome浏览器怎么看视频出现绿屏_视频播放绿屏问题的解决方案Chrome浏览器怎么看视频出现绿屏_视频播放绿屏问题的解决方案

    绿屏问题通常由硬件加速或GPU缓存异常引起,可依次尝试禁用硬件加速、清除GPU缓存、重置chrome://flags实验性功能,并通过快捷方式添加–disable-gpu参数临时修复。 如果您在使用Chrome浏览器观看视频时遇到屏幕显示为绿色,这通常与浏览器的硬件加速功能或GPU(图形…

    2026年9月24日 • 用户投稿
    400
  • 抖音店铺层级从低到高怎么设置?抖音怎么创建店铺位置

    抖音电商逐渐崛起,成为众多商家争相入驻的舞台。抖音店铺层级设置作为商家在抖音平台上的重要环节,直接影响着店铺的运营效果和品牌形象。本文将从低到高详细解析抖音店铺层级设置,帮助商家打造优质电商品牌。 一、抖音店铺层级概述 抖音店铺层级分为五个等级,从低到高依次为:新手店铺、成长店铺、成熟店铺、优质店铺…

    2026年9月24日
    1300
  • 谷歌 Pixel 11 或搭载联发科 M90 基带,带来通信提升

    谷歌 Pixel 11 或搭载联发科 M90 基带,带来通信提升谷歌 Pixel 11 或搭载联发科 M90 基带,带来通信提升谷歌 Pixel 11 或搭载联发科 M90 基带,带来通信提升谷歌 Pixel 11 或搭载联发科 M90 基带,带来通信提升

    今年 8 月,谷歌正式推出了 Pixel 10 系列手机,其核心配置了 Tensor G5 处理器。 在该系列发布前,曾有消息称 Pixel 10 的原型机测试过联发科基带。不过最终量产机型仍采用了三星的 Exynos 5400 调制解调器,因此通信性能未实现显著提升。但根据最新消息,谷歌并未终止与…

    2026年9月24日 • 用户投稿
    000
  • Java中自定义日志器的简化与自动化:避免重复声明

    Java中自定义日志器的简化与自动化:避免重复声明Java中自定义日志器的简化与自动化:避免重复声明Java中自定义日志器的简化与自动化:避免重复声明Java中自定义日志器的简化与自动化:避免重复声明

    本文探讨了在Java应用中,尤其是在不能使用Lombok或Spring等流行框架时,如何简化自定义日志器(如MXLogger)的声明和初始化。我们将介绍通过自定义工厂、基类继承和静态工具方法来减少重复代码,并深入分析在“简单Java”环境下实现纯注解驱动自动注入的复杂性,提供实用的解决方案。 挑战:…

    2026年9月24日 • 用户投稿
    100
  • 散热系统的设计如何影响高端硬件的长期稳定性?

    散热系统的设计如何影响高端硬件的长期稳定性?散热系统的设计如何影响高端硬件的长期稳定性?散热系统的设计如何影响高端硬件的长期稳定性?散热系统的设计如何影响高端硬件的长期稳定性?

    散热系统设计直接决定高端硬件的长期稳定性,优良设计可有效控制温度、抑制热点、减少热应力损伤,从而延缓性能衰减、提升可靠性;反之则加速老化、引发故障。高性能计算因持续高负载对散热更敏感,要求温度稳定以保障运算精度与连续性。液体冷却凭借高效导热和低噪优势成为高端配置主流,但存在成本高、复杂性强及漏液风险…

    2026年9月24日 • 用户投稿
    1100
  • UC浏览器为什么不能复制文字_UC浏览器无法复制文字问题解决方法

    UC浏览器为什么不能复制文字_UC浏览器无法复制文字问题解决方法UC浏览器为什么不能复制文字_UC浏览器无法复制文字问题解决方法UC浏览器为什么不能复制文字_UC浏览器无法复制文字问题解决方法UC浏览器为什么不能复制文字_UC浏览器无法复制文字问题解决方法

    无法复制文字可能是因网页保护或浏览器设置所致。首先检查是否启用内容保护,尝试切换至电脑版浏览;其次关闭UC浏览器的阅读模式以恢复原文选中功能;接着清除浏览器缓存数据,重启后测试复制功能;若仍无效,可开启无障碍服务如屏幕朗读或OCR识别提取文字;最后可通过分享链接到微信等应用,在其他浏览器中打开并复制…

    2026年9月24日 • 用户投稿
    1400

发表回复

登录后才能评论
关注微信