`
johnnyking
  • 浏览: 18506 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

java 之多线程 LOCK实现(四)

 
阅读更多

接lock实现(三),由于peterson lock实现只能解决双线程同步互斥,那么N线程互斥 如何做呢?看下文。。。

设计一个Level(N)的N个过滤空间,每个线程到达临界区需要走过所有的Level空间。所有的level 都必须满足以下两个条件:

    1)至少有一个尝试进入Level(N)的线程会成功。

    2)如果有多个线程尝试进入一个Leven(N),则至少有一个会被阻塞(继续在这个leven(N)外等待。)。

public class BakeryLock implements Lock{

  private int[] level;
  private int[] victim;

  public void init(int threadSize) {
      level = new int[threadSize];
      victim = new int[threadSize];
      for (int i = 0; i < threadSize; i++) {
          level[i] = 0;
      }
  }


   public void lock() {
      int currentThreadId = ThreadUtil.getCurrentId();
      
      for (int i = 1; i < level.length; i++) {
  
          level[currentThreadId] = i;
          victim[i] = currentThreadId;

          /**存在一个线程K,K != currentThreadId,使得level[k] >= i
           **/
          while(  (exist K != currentThreadId)(level[k] >= i && victim[i] == currentThreadId)  ) {


           }

      }

      public void unlock() {

          int currentThreadId = ThreadUtil.getCurrentId();
          level[currentThreadId] = 0
      }

   }

 

 

level[n] 是n个过滤空间(n个小屋子),如果一个线程要进入到临界区,必须得通过所有的小屋子,如果有超过1个线程同时进入到一个小屋子里,则至少有一个线程会被阻塞在while循环中,一直等待到找不到 这样的K,使得level[k] >=currentThreadId. 每个leve层 有一个冲突域victim,用来过滤出 某个线程,是这个线程不能进入下一层level[i + 1]

引理:对于 0 到N-1层中的 整数J,level[j]上最多有n - j个线程。

证明:归纳法:

         1)第0层,level[0]上最多有N个线程

         2)第1层,最多有N - 1个线程,因为有一个线程会被阻塞。

         3)假设第J-1层最多有N-j+1个线程,那么我们来做 第J层的推算。

             不失一般性,假如A是最后一个执行victim[j] = A, 那么

             write(B)(victim[j]) -> write(A)(victim[j])->read(B)(victime[j] == A)

             B先进入临界区,这个时候A肯定会读到 level[k] >= i 且 victim[i] == currentThreadId,所以在while处等待。

 

分享到:
评论

相关推荐

    java实现多线程文件传输

    在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源...在提供的`java多线程文件传输`压缩包中,可能包含了实现这些概念的示例代码,通过分析和学习,可以更好地理解多线程文件传输的原理和实践。

    java多线程进度条

    本主题将深入探讨如何在Java多线程环境下实现进度条功能。 首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    java多线程实现大批量数据导入源码

    本项目以"java多线程实现大批量数据导入源码"为题,旨在通过多线程策略将大量数据切分,并进行并行处理,以提高数据处理速度。 首先,我们需要理解Java中的线程机制。Java通过`Thread`类来创建和管理线程。每个线程...

    JAVA单线程多线程

    ### JAVA中的单线程与多线程概念解析 #### 单线程的理解 在Java编程环境中,单线程指的是程序执行过程中只有一个线程在运行。这意味着任何时刻只能执行一个任务,上一个任务完成后才会进行下一个任务。单线程模型...

    浅谈JAVA中多线程的实现.zip

    了解并熟练掌握这些Java多线程的概念和实践技巧,对于编写高性能、并发友好的Java应用至关重要。在实际开发中,合理地使用多线程可以提高程序的运行效率,但也需要考虑到线程安全、资源竞争等问题,避免出现死锁、...

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    java多线程Demo

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,实现多线程有两种主要方式:继承Thread类和实现Runnable接口。 1. 继承Thread类: 当我们创建一个新...

    java采用多线程实现抢红包程序完整源码

    在Java编程领域,多线程技术是实现并发执行任务的关键,尤其在开发高并发应用时,如本例中的“抢红包”程序。本程序利用Java的多线程特性,模拟了现实生活中多人同时抢红包的场景。以下是这个抢红包程序涉及的一些...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多线程并发概念及其应用。 首先,我们要了解Java中的线程。线程是...

    java多线程经典案例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,极大地提升了程序的效率和性能。在Java中,实现多线程有两种主要方式:通过实现Runnable接口或者继承Thread类。本案例将深入探讨Java多线程中的关键...

    java多线程处理数据库数据

    本主题将深入探讨如何使用Java的并发包(java.util.concurrent)来实现多线程对数据库数据的批量处理,包括增、删、改等操作。 首先,我们需要了解Java中的线程基础。线程是程序执行的最小单位,一个进程可以包含多...

    java多线程设计

    本知识点将深入探讨Java多线程设计以及如何利用“不可变对象”(immutable objects)来避免多线程环境中的非安全问题。 一、Java多线程基础 1. 线程的创建:Java提供了两种创建线程的方式——继承Thread类和实现...

    Java 模拟线程并发

    最后,Java并发库还包含了很多其他有用的工具,如Semaphore(信号量)用于控制同时访问特定资源的线程数量,CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)用于多线程间的协作,以及Lock接口及其实现如...

    Java多线程练习题

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...

    Java多线程实现.pdf

    Java多线程编程是Java平台的核心特性之一,特别是在Java 5之后,其并发包`java.util.concurrent`提供了更强大和高效的工具,使得开发者能够更好地管理线程资源,提高应用程序的性能和可伸缩性。本篇文章将深入探讨...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    JAVA多线程编程技术PDF

    这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点。 首先,多线程的核心概念包括线程的创建与启动。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。创建后...

    java多线程示例

    在Java编程语言中,多...通过以上知识点,我们可以更好地理解和运用Java多线程,实现高效、稳定的并发程序。文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。

Global site tag (gtag.js) - Google Analytics