Java并发编程:从同步容器到并发容器的演进

引言

随着计算机技术的发展,多核处理器已经成为现代硬件的标配,这也使得并发编程成为了软件开发中的一个不可忽视的领域。并发编程是指多个任务在同一时间段内执行的编程技术,它能够充分利用多核处理器的性能,提高程序的运行效率和响应速度。然而,并发编程也带来了一系列的挑战,如数据竞争、死锁等问题,这些问题需要通过合适的数据结构和算法来解决。

在并发环境下,容器(也称为集合)起到了存储和管理数据的关键作用。容器的选择直接影响到并发程序的性能和正确性。传统的同步容器在多线程环境下存在性能瓶颈和线程安全性问题,因为它们通常通过内部锁来保证线程安全,这可能导致多个线程竞争同一个锁,从而降低程序的并发性能。

与此相对,并发容器是为了在高并发环境下提供更好的性能和线程安全性而设计的。它们采用了更为先进的同步策略和数据结构,如锁分段、非阻塞算法等,以减少线程之间的竞争和阻塞,从而提高程序的并发性能。

简单地说,同步容器和并发容器的主要区别在于它们在处理多线程访问时的策略。同步容器通过内部锁来保证线程安全,而并发容器则通过更为精细的同步机制和数据结构来提供更高的并发性能和线程安全性。

本文将深入探讨Java中的同步容器和并发容器,包括它们的概念、工作原理、使用方法以及性能分析。我们将从同步容器的基础开始,逐步介绍并发容器的出现和演进,最后讨论如何在实际开发中选择合适的容器,并提供一些最佳实践和未来发展的展望。通过本文,读者将能够更好地理解Java并发编程中容器的重要性和如何有效地利用它们来提高程序的并发性能和线程安全性。

同步容器概述

什么是同步容器

同步容器是设计用于多线程环境的数据结构,其主要目的是为了保证在多个线程同时访问时,数据的安全性和一致性。在Java中,同步容器通过内部的同步机制(通常是锁)来确保线程安全。这些容器能够确保在并发访问时数据不会被破坏或出现不一致的状态。

同步容器的例子

Java标准库中有一些同步容器的例子,如VectorHashtable以及通过Collections工具类提供的synchronizedList。这些容器都是线程安全的,可以在多线程环境下使用。

  • Vector: 它是一个动态数组,与ArrayList相似,但是所有的公共方法都是同步的。

    Vector<String> vector = new Vector<>();
    vector.add("Java");
    vector.add("Concurrency");
    
  • Hashtable: 是一个散列表,存储键值对。它与HashMap类似,但所有的公共方法都是同步的。

    Hashtable<String, Integer> hashtable = new Hashtable<>();
    hashtable.put("one", 1);
    hashtable.put("two", 2);
    
  • Collections.synchronizedList: 通过Collections工具类可以创建一个同步的列表。

    List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
    synchronizedList.add("Java");
    synchronizedList.add("Concurrency");
    

同步容器的工作原理

同步容器的工作原理主要依赖于内部的同步机制,通常是使用锁来实现。当一个线程访问容器的某个方法时,会获取该容器的锁,其他线程必须等待当前线程释放锁后才能继续执行。这种机制确保了同一时刻只有一个线程能够访问容器,从而保证了数据的线程安全性。

同步容器的问题与局限性

虽然同步容器能够确保线程安全,但它们也存在一些问题和局限性:

  • 性能瓶颈: 由于同步容器在多线程环境下通常需要获取锁,这可能导致多个线程之间的竞争,从而降低程序的并发性能。

  • 死锁风险: 如果在使用同步容器时,不正确地管理锁的获取和释放,可能会导致死锁。

  • 缺乏扩展性: 在高并发场景下,同步容器的性能可能无法满足需求,因为它们依赖于锁来实现线程安全,而锁可能成为性能瓶颈。

总的来说,同步容器在处理简单的多线程并发问题时是有用的,但在高并发、高性能的场景下,可能需要考虑使用更为先进和高效的并发容器。

并发容器的出现

为什么需要并发容器

随着硬件技术的发展,多核处理器已经成为现代计算机的标准配置。这使得并发编程不仅仅是一个高级主题,而是每个Java开发人员都需要掌握的技能。在多线程环境下,传统的同步容器可能会成为性能瓶颈,因为它们通常通过锁来确保线程安全,这可能导致多个线程之间的竞争和阻塞。为了充分利用多核处理器的并行计算能力,并发容器应运而生。

并发容器是专为高并发环境设计的数据结构,它们采用了更为先进的同步机制和数据结构,如锁分段、非阻塞算法等,以减少线程之间的竞争和阻塞,从而提高程序的并发性能和线程安全性。

并发容器与同步容器的性能比较

在性能方面,并发容器通常能够提供更好的扩展性和吞吐量,特别是在高并发场景下。与同步容器相比,它们减少了锁的使用,从而降低了线程之间的竞争和阻塞,提高了程序的并发性能。此外,一些并发容器还采用了更为高效的数据结构和算法,如锁分段技术、非阻塞算法等,进一步提高了性能。

Java中的并发容器简介

Java标准库提供了一系列高效的并发容器,这些容器在设计时就考虑了线程安全和性能。以下是一些常用的Java并发容器:

  • ConcurrentHashMap: 它是一个高效的并发哈希表,采用了锁分段技术来减少锁的粒度,从而提高并发性能。

    ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
    map.put("one", 1);
    map.put("two", 2);
    
  • CopyOnWriteArrayList: 它是一个线程安全的列表,采用了写时复制策略,每次修改都会创建一个新的副本,从而避免了锁竞争。

    CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
    list.add("Java");
    list.add("Concurrency");
    
  • BlockingQueue: 它是一个阻塞队列,提供了生产者-消费者模式的支持,常用于多线程协作的场景。

    BlockingQueue<String> queue = new LinkedBlockingQueue<>();
    queue.put("Java");
    queue.put("Concurrency");
    

这些并发容器不仅提供了高效的线程安全数据结构,还提供了一系列的并发工具和算法,如同步器、计数器、信号量等,以支持复杂的并发编程任务。它们在实际开发中被广泛应用于各种高并发场景,如网络编程、并行计算、消息传递等。

总的来说,Java的并发容器为开发人员提供了强大的工具和API,帮助他们更容易地编写高效、线程安全的并发程序。在面对高并发和多核处理器的挑战时,掌握并正确使用并发容器是至关重要的。

Java中的同步容器

VectorHashtable的使用与示例

Java的标准库中提供了一些传统的同步容器,其中最常见的就是VectorHashtable

  • Vector: Vector是一个动态数组,与ArrayList类似,但所有的公共方法都是同步的。这意味着当多个线程同时访问Vector时,所有的操作都会进行同步,从而保证线程安全。

    Vector<String> vector = new Vector<>();
    vector.add("Java");
    vector.add("Concurrency");
    
  • Hashtable: Hashtable是一个散列表,它与HashMap类似,但所有的公共方法都是同步的。它提供了键值对的存储,适用于需要线程安全的场景。

    Hashtable<String, Integer> hashtable = new Hashtable<>();
    hashtable.put("one", 1);
    hashtable.put("two", 2);
    

Collections.synchronizedList和其他同步包装器的使用

除了VectorHashtable之外,Java还提供了一种更为灵活的方式来创建同步容器,那就是使用Collections类中的synchronizedList方法和其他同步包装器。

  • Collections.synchronizedList: 这是一个静态方法,可以将任何普通的List转换为线程安全的List

    List<String> list = new ArrayList<>();
    List<String> synchronizedList = Collections.synchronizedList(list);
    synchronizedList.add("Java");
    synchronizedList.add("Concurrency");
    

通过使用synchronizedList和其他同步包装器,开发人员可以更灵活地控制哪些部分需要同步,从而在某些场景下提高性能。

同步容器的线程安全性分析

同步容器通过内部的同步机制(通常是锁)来确保线程安全。这意味着当一个线程正在执行同步容器的某个方法时,其他线程必须等待,直到该方法执行完成。这种机制虽然简单,但也带来了一些问题,如性能瓶颈、死锁风险等。

  • 性能瓶颈: 因为同步容器通常在整个方法级别上进行同步,所以可能会导致多个线程之间的竞争和阻塞,从而降低性能。

  • 死锁风险: 如果在使用同步容器时,不正确地管理锁的获取和释放,可能会导致死锁。

同步容器的性能分析

由于同步容器需要在整个方法级别上进行同步,这可能会导致多个线程之间的竞争和阻塞,从而降低程序的并发性能。此外,同步容器在处理高并发和大数据量的场景时,可能无法充分利用多核处理器的性能优势,因为它们依赖于锁来实现线程安全,而锁可能成为性能瓶颈。

总的来说,虽然同步容器在某些简单的多线程并发问题上是有用的,但在面对高并发、高性能的场景时,可能需要考虑使用更为先进和高效的并发容器。

Java中的并发容器

ConcurrentHashMap的工作原理与使用示例

ConcurrentHashMap是Java并发容器中的一个重要组成部分,它是一个高效的并发哈希表。与传统的同步容器(如Hashtable)不同,ConcurrentHashMap采用了锁分段技术,将整个哈希表分为多个段(Segment),每个段都有自己的锁。这种设计在高并发场景下能够大大减少锁的粒度,从而提高并发性能。

  • 使用示例:

    ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
    map.put("one", 1);
    map.put("two", 2);
    

CopyOnWriteArrayList的工作原理与使用示例

CopyOnWriteArrayList是一个线程安全的列表,它采用了写时复制(Copy-On-Write)的策略。当进行写操作(如添加、修改、删除元素)时,它会创建一个新的数组,并将数据复制过去,然后再进行写操作。这种设计在读多写少的场景下非常高效。

  • 使用示例:

    CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
    list.add("Java");
    list.add("Concurrency");
    

BlockingQueue及其实现类的工作原理与使用示例

BlockingQueue是一个阻塞队列,它提供了生产者-消费者模型的支持,用于多线程协作的场景。BlockingQueue提供了多种实现类,如LinkedBlockingQueueArrayBlockingQueue等,它们在不同的场景下有着不同的特点。

  • 使用示例:

    BlockingQueue<String> queue = new LinkedBlockingQueue<>();
    queue.put("Java");
    queue.put("Concurrency");
    

并发容器的线程安全性分析

Java的并发容器通过内部的同步机制(如锁分段、写时复制、阻塞队列等)来确保线程安全。这些容器能够在高并发环境下提供线程安全的数据操作,而无需显式地使用外部锁。

  • 线程安全性分析:

    • ConcurrentHashMap: 锁分段技术减少了锁的粒度,提高了并发性能。
    • CopyOnWriteArrayList: 写时复制策略保证了在写操作时的线程安全。
    • BlockingQueue: 队列的阻塞特性确保了生产者和消费者之间的同步。

并发容器的性能分析

并发容器在设计时考虑了高并发和多核处理器的优化,它们通过减少锁的粒度、利用写时复制策略、实现非阻塞算法等技术,提高了并发性能。

  • 性能分析:

    • ConcurrentHashMap: 锁分段技术和高效的哈希算法提高了并发性能。
    • CopyOnWriteArrayList: 在读多写少的场景下性能优于同步列表。
    • BlockingQueue: 高效的队列操作和阻塞特性确保了高并发性能。

总的来说,Java的并发容器为开发人员提供了强大的工具,帮助他们更容易地编写高效、线程安全的并发程序。在面对高并发和多核处理器的挑战时,掌握并正确使用并发容器是至关重要的。

并发容器的高级特性

锁分段技术(如在ConcurrentHashMap中的应用)

锁分段技术是一种常用于优化并发性能的策略,它在ConcurrentHashMap中得到了广泛的应用。ConcurrentHashMap内部分为多个段(Segment),每个段都有自己的锁。这种设计使得多个线程可以同时访问不同的段,从而减少了锁的竞争,提高了并发性能。

  • 锁分段技术的优势:
    • 减少锁的粒度,提高并发度。
    • 增强了并发性能和扩展性。
    • 提供了更细粒度的控制,减少了锁的等待时间。

非阻塞算法(如ConcurrentLinkedQueue中的应用)

非阻塞算法是一种不依赖于锁的并发算法,它通过原子操作和CAS(Compare-And-Swap)等技术来实现线程安全。ConcurrentLinkedQueue就是一个使用非阻塞算法实现的无界队列,它在高并发环境下表现出色。

  • 非阻塞算法的特点:
    • 不需要使用锁,减少了线程间的竞争和阻塞。
    • 提供了高并发的处理能力。
    • 适用于高吞吐量和低延迟的应用场景。

弱一致性迭代器的概念与优势

与传统的迭代器(如ArrayList的迭代器)不同,弱一致性迭代器在遍历过程中允许其他线程对容器进行修改。这在并发环境下是非常有用的,因为它允许并发地进行读和写操作,而无需额外的同步。

  • 弱一致性迭代器的优势:
    • 提高了并发性能,允许读和写的并发操作。
    • 简化了编程模型,减少了同步的需求。
    • 提供了更好的响应性能,特别是在高并发环境下。

通过以上的高级特性,Java并发容器不仅提供了基本的线程安全和高并发性能,还为开发人员提供了更为灵活和高效的编程模型。在面对复杂的并发场景和高性能要求时,这些高级特性能够帮助开发人员更好地优化程序性能,提高系统的并发能力。

总体而言,掌握并理解这些高级特性是Java并发编程中的重要一环,它们为开发人员提供了丰富的工具和策略,帮助他们构建高效、可扩展和可维护的并发程序。

从同步容器到并发容器的实践

实际开发中如何选择合适的容器

在实际的开发过程中,选择合适的容器是非常关键的。对于那些不需要高并发和线程安全保证的场景,同步容器可能是一个简单且方便的选择。而对于高并发、需要线程安全和性能优化的场景,则应选择并发容器。

选择同步容器的场景

  • 数据量较小,访问频率不高。
  • 不需要并发修改容器的数据。
  • 对性能要求不高,可以接受简单的同步机制。

选择并发容器的场景

  • 高并发访问,需要保证线程安全。
  • 需要进行大量的读写操作。
  • 对性能有较高要求,希望利用多核处理器的优势。

重构现有代码从同步容器迁移到并发容器的案例分析

假设我们有一个使用Vector作为数据存储的应用,现在需要优化它以适应高并发环境。

原始代码

Vector<String> vector = new Vector<>();
// ... 在多个线程中并发访问和修改vector ...

重构后的代码

ConcurrentHashMap<String, String> concurrentMap = new ConcurrentHashMap<>();
// ... 在多个线程中并发访问和修改concurrentMap ...

在这个简单的案例中,我们通过将Vector替换为ConcurrentHashMap来实现了数据的线程安全和性能优化。当然,实际的重构可能涉及更多的代码和业务逻辑。

并发容器使用的最佳实践

  1. 避免不必要的同步:尽量减少对并发容器的不必要同步,只在必要时进行同步操作。
  2. 使用高级特性:充分利用并发容器提供的高级特性,如锁分段、非阻塞算法等,以提高性能。
  3. 注意线程安全问题:虽然并发容器提供了线程安全的操作,但仍需注意业务逻辑的正确性。
  4. 性能测试:在选择和使用并发容器后,进行性能测试以确保满足性能要求。
  5. 持续优化:随着业务需求的变化和系统的发展,不断地对并发容器进行优化和调整。

总的来说,从同步容器迁移到并发容器需要细致的计划和实施。在实践中,开发人员需要根据实际需求和场景来选择合适的容器,并遵循一定的最佳实践来确保系统的稳定性和性能。

通过以上的实践,我们可以看到,并发容器不仅提供了线程安全和高并发性能,还为开发人员提供了更为灵活和高效的编程模型,帮助他们更好地应对复杂的并发编程挑战。

结论

在Java并发编程的世界中,容器的选择对于系统的性能、可维护性和扩展性都有着至关重要的影响。同步容器和并发容器都有各自的优点和适用场景,理解它们之间的区别和特性,以及何时使用何种容器,是每个Java开发者必须掌握的知识。

同步容器与并发容器的适用场景总结

  • 同步容器:适用于数据量较小、访问频率不高的场景,或者不需要保证线程安全和高并发性能的简单应用中。

  • 并发容器:适用于需要高并发、线程安全和性能优化的场景,特别是在多核处理器的环境下,可以充分利用其并行处理能力。

并发容器在现代多核处理器中的重要性

随着硬件技术的发展,现代多核处理器已经成为主流,这使得并发编程成为了不可避免的趋势。并发容器的出现和发展,不仅为开发者提供了更为便捷和高效的并发编程工具,同时也为系统的性能和扩展性提供了强大的支持。通过合理地利用并发容器,开发者可以更好地发挥多核处理器的潜能,实现系统的并发执行和高性能。

对未来Java并发容器发展的展望

随着技术的进步和业务需求的变化,我们可以预见Java并发容器将继续发展和完善。未来的并发容器可能会更加智能化,能够根据应用的需求自动调整内部的数据结构和算法,以达到最优的性能和资源利用率。同时,随着硬件技术的不断革新,我们也可以期待并发容器能够更好地适应未来更为复杂和多样化的硬件环境。

总的来说,Java并发容器是现代并发编程的重要组成部分,对于开发者来说,掌握并合理使用它们是提高系统性能和开发效率的关键。在未来的发展中,我们有理由相信,并发容器将会继续为Java开发者带来更多的便利和可能性。

参考资料

本文的撰写过程中,我们参考了众多权威的书籍、文章和官方文档,以确保内容的准确性、全面性和专业性。以下是本文编写过程中主要参考的资料:

书籍

  1. “Java Concurrency in Practice” - Brian Goetz等
    这本书是Java并发编程领域的经典之作,深入解析了Java中的并发机制和最佳实践,为本文提供了丰富的理论基础。

  2. “Effective Java” - Joshua Bloch
    该书涵盖了Java编程的多个方面,其中也包括了关于容器和并发编程的有价值的建议和经验。

  3. “Java Performance: The Definitive Guide” - Scott Oaks
    本书详细讲解了Java程序性能优化的各个方面,对于我们分析同步容器和并发容器的性能提供了重要参考。

文章

  1. Java官方文档
    Java官方文档中关于Vector, Hashtable, ConcurrentHashMap, CopyOnWriteArrayList, BlockingQueue等类的描述和示例对本文的编写提供了直接的参考。

  2. “Java Collections Framework” - Baeldung
    Baeldung网站上有关Java集合框架的文章提供了许多实用的示例和解释,帮助我们深入理解Java中的容器。

  3. “Understanding Java’s Concurrent Collections” - JavaSpecialists Newsletter
    这篇文章从专家的角度解析了Java的并发集合,对我们理解并发容器的设计和应用有很大帮助。

官方文档

  1. Java SE Documentation
    Java官方文档中的并发包部分对java.util.concurrent包中的类和接口进行了详细的描述,包括ConcurrentHashMap, CopyOnWriteArrayList, BlockingQueue等的工作原理和使用方法。

  2. OpenJDK源代码
    阅读OpenJDK的源代码帮助我们更深入地了解并发容器的实现细节,特别是锁分段技术、非阻塞算法等高级特性的实现。

以上资料为本文提供了坚实的理论基础和实践指导,帮助我们全面而深入地探讨了Java并发编程中从同步容器到并发容器的演进。感谢所有为Java社区做出贡献的作者和组织,他们的工作为本文提供了宝贵的参考资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/567493.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

莫名锁表? --- mysql的事务隔离级别

前言 系统响应超时 系统访问数据库特别慢 莫名提示锁等待超时 数据库锁表 事务长时间等锁&#xff0c;直到超时 以上问题都可能是事务锁表导致的 问题 今天测试反馈系统批量处理莫名提示锁等待超时&#xff0c;再次操作查看数据库事务确实存在等锁情况&#xff0c;甚至死锁。…

模版初阶【C++】

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

NLP自然语言处理_序章

开一个新篇章&#xff0c;立一个flag&#xff0c;用一段时间来学习一下NLP&#xff0c;涨涨见识。 准备以B站 机器学习算法到transformer神经网络模型应用视频作为入门&#xff0c;此分类专门用于记录学习过程中的知识点以备自用。 一、何为NLP自然语言处理&#xff1f; NLP…

云原生的基石:containerd引领未来容器发展趋势

文章目录 一、Containerd简介&#xff1a;容器技术的心脏二、Containerd核心原理解析三、Containerd与Docker的关系四、Containerd在云原生应用部署中的作用五、Containerd的扩展性和插件机制六、Containerd的安全特性七、Containerd的性能优化八、Containerd的社区和生态系统九…

文本向量化模型新突破——acge_text_embedding勇夺C-MTEB榜首

在人工智能的浪潮中&#xff0c;以GPT4、Claude3、Llama 3等大型语言模型&#xff08;LLM&#xff09;无疑是最引人注目的潮头。这些模型通过在海量数据上的预训练&#xff0c;学习到了丰富的语言知识和模式&#xff0c;展现了出惊人的能力。在支撑这些大型语言模型应用落地方面…

RTSP/Onvif视频监控平台EasyNVR如何提高匿名用户的用户名和密码安全性?

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

tcp inflight 守恒算法背后的哲学

tcp inflight 守恒拥塞控制的正确性 很久以前我开始纠结 tcp 锯齿&#xff0c;很多年后我知道这叫 capacity-seeking&#xff0c;甚至说 tcp 属于 capacity-seeking protocol 的原因就是它早已深入人心的 aimd 行为&#xff0c;而该行为生成了 tcp 锯齿。 在消除锯齿&#xf…

Python-VBA函数之旅-input函数

目录 一、input函数的常见应用场景&#xff1a; 二、input函数使用注意事项&#xff1a; 三、如何用好input函数&#xff1f; 1、input函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博…

hcia datacom课程学习(7):直连路由、静态路由

直连路由路由器接口上的网络&#xff08;接口配置了IP地址并且开启&#xff09;静态路由管理员手工添加的网络动态路由路由器之间动态学习形成的网络 1.直连路由 每当给路由器的一个接口配置了ip&#xff0c;路由表中就会产生对应的直连路由 配置路由接口ip的命令&#xff1…

web测试基础知识

目录 web系统的基础 web概念(worldwideweb) 网络结构 发展 架构 B/S C/S P2P 工作原理 静态页面 动态页面 web客户端技术 浏览器的核心--渲染引擎 web服务器端技术 web服务器 应用服务器 集群环境 数据库 案例-URL 协议类型 主机名 端口 IP地址 分类 …

【国产替代】航空电子通信总线航空电子通信总线产品为MIL-STD-1553和ARINC 429等协议提供原生支持

航空电子通信总线 航空电子通信总线产品为MIL-STD-1553和ARINC 429等协议提供原生支持。这些产品用于进行航空电子应用所需的开发、生产和系统测试。 PXIe&#xff0c;2通道PXI ARINC-664接口模块 AIM ARINC-664具有板载处理器&#xff0c;可自动处理所有与协议相关的活动&…

Java进阶-日志框架

概述 小结 体系 Logback概述 Logback快速入门 1.下载 一般情况&#xff0c;Logback日志框架只需要下载slf4j-api、logback-core、logback-classic这三个jar包即可。 slf4j-api-1.7.26.jar官网下载链接&#xff1a; https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7…

docker部署通义千问-7B-Chat的openai-api环境

服务器环境&#xff1a; 显卡驱动&#xff1a;Driver Version: 530.30.02 CUDA版本&#xff1a;CUDA Version: 12.1 显卡&#xff1a;NVIDIA GeForce RTX 3090共4张 注意&#xff1a;最好把显卡驱动升级到530&#xff0c;CUDA版本之前使用11.7有问题。 一、下载模型文件 …

炉管设备的内部构造详解

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff09;里的学员问&#xff1a;炉管设备&#xff08;立式&#xff09;的内部构造是怎样的&#xff1f; 如上图&#xff0c;是一个典型的&#xff1a; 上半部&#xff1a; Heating Element&#xff08;加热线圈…

ThingsBoard服务端使用RPC通过网关给设备发送消息

一、概述 1、发送服务器端网关RPC 二、案例&#xff1a; 1、建立设备与网关之间的通讯 2、查看设备和网关是否在线状态啊 3、通过 仪表盘&#xff0c;创建设备A的模拟RPC调用的窗口链接 4、在客户端的网关设备上订阅RPC网关的主题信息 5、通过服务端的窗口&#xff0c;发…

24V转2.8V2A降压芯片WT6030

24V转2.8V2A降压芯片WT6030 WT6030是一种高效同步整流降压开关模式转换器&#xff0c;集成内部功率MOSFET。该器件在宽输入电源范围内提供3A峰值输出电流&#xff0c;展现出卓越的负载和线路调节性能。其设计仅需要最小数量的外部现成组件&#xff0c;并且采用了节省空间的ESO…

JRT多服务器同步程序

之前的JRT只部署在一个服务器&#xff0c;实际运用可能会有数台、数十台、或者更多服务器。那么多台服务器就需要程序同步机制。这里借助Rsync同步&#xff0c;但是有个问题是Rsync同步jar之后他不知道是否需要重启站点&#xff0c;为此实现java控制台驱动Rsync&#xff0c;重定…

8.4.1 实验1:创建 VLAN 和划分端口

1、实验目的 通过本实验可以掌握&#xff1a; VLAN的概念。创建VLAN的方法。把交换机端口划分到VLAN中的方法。 2、实验拓扑 创建 VLAN 和划分端口的实验拓扑如下图所示。 图8-5 创建 VLAN 和划分端口的实验拓扑 3、实验步骤 &#xff08;1&#xff09;实验准备 S1#eras…

【Elasticsearch】Elasticsearch 从入门到精通(一):基本介绍

《Elasticsearch 从入门到精通》共包含以下 2 2 2 篇文章&#xff1a; Elasticsearch 从入门到精通&#xff08;一&#xff09;&#xff1a;基本介绍Elasticsearch 从入门到精通&#xff08;二&#xff09;&#xff1a;基础使用 &#x1f60a; 如果您觉得这篇文章有用 ✔️ 的…

​Gu‘reum 工作室在The Sandbox推出 2024 年农历新年活动!

通过区块链游戏分享韩国文化并建立社区&#xff01; 去年 12 月&#xff0c;Gurenum 工作室 在The Sandbox 元宇宙上发起了 2023 年年末 Lan Party 直播活动。 https://sandboxgame.medium.com/gureum-studio-hosts-a-year-end-lan-party-in-the-sandbox-metaverse-b9a3fc6e7b9…