`
luccs624061082
  • 浏览: 84737 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
   同步代码依赖一种简单的可重入锁。虽然这种锁很容易使用,但是有许多局限。许多复杂的锁形式是由java.util.concurrent.locks包支持。我们不详细解释这个包,但是了关注它最重要最基本的接口,Lock。

   Lock对象的工作机制与用同步代码的隐式锁很相似。作为隐式锁,只有一个线程能一次拥有一个锁对象。所对象也支持wait/notify机制。,通过它们关联的条件对象。

   锁对象超过瘾式锁的最大优点是它们能撤回试图获取一个锁。tryLock方法会立即撤回如果发现锁是不可用的或者时间超时(如果有时间限制)。lockInterruptibly 方法撤回,如果另外一个线程发了一个中断在获取到锁之前。

   让我们使用锁对象解决活性(Liveness)小节中的死锁问题。Alphonse和Gaston已经训练他们去通知,当一个朋友将鞠躬的时候。我们改进了模型,通过要求在互相鞠躬前我们的朋友对象必须获取参与者双方的锁。这里是改进模型的源码,Safelock。为了验证这种形式的功能,我们假设 Alphonse和Gaston这样迷恋安全鞠躬的能力,他们不可以停止相互鞠躬。

   import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.Random;

public class Safelock {
    static class Friend {
        private final String name;
        private final Lock lock = new ReentrantLock();

        public Friend(String name) {
            this.name = name;
        }

        public String getName() {
            return this.name;
        }

        public boolean impendingBow(Friend bower) {
            Boolean myLock = false;
            Boolean yourLock = false;
            try {
                myLock = lock.tryLock();
                yourLock = bower.lock.tryLock();
            } finally {
                if (! (myLock && yourLock)) {
                    if (myLock) {
                        lock.unlock();
                    }
                    if (yourLock) {
                        bower.lock.unlock();
                    }
                }
            }
            return myLock && yourLock;
        }
           
        public void bow(Friend bower) {
            if (impendingBow(bower)) {
                try {
                    System.out.format("%s: %s has"
                        + " bowed to me!%n",
                        this.name, bower.getName());
                    bower.bowBack(this);
                } finally {
                    lock.unlock();
                    bower.lock.unlock();
                }
            } else {
                System.out.format("%s: %s started"
                    + " to bow to me, but saw that"
                    + " I was already bowing to"
                    + " him.%n",
                    this.name, bower.getName());
            }
        }

        public void bowBack(Friend bower) {
            System.out.format("%s: %s has" +
                " bowed back to me!%n",
                this.name, bower.getName());
        }
    }

    static class BowLoop implements Runnable {
        private Friend bower;
        private Friend bowee;

        public BowLoop(Friend bower, Friend bowee) {
            this.bower = bower;
            this.bowee = bowee;
        }
   
        public void run() {
            Random random = new Random();
            for (;;) {
                try {
                    Thread.sleep(random.nextInt(10));
                } catch (InterruptedException e) {}
                bowee.bow(bower);
            }
        }
    }
           

    public static void main(String[] args) {
        final Friend alphonse =
            new Friend("Alphonse");
        final Friend gaston =
            new Friend("Gaston");
        new Thread(new BowLoop(alphonse, gaston)).start();
        new Thread(new BowLoop(gaston, alphonse)).start();
    }
}

这里后面添加这段源码的分析。
分享到:
评论

相关推荐

    快速查找oracle锁对象

    在Oracle数据库管理中,"快速查找Oracle锁对象"是一个关键任务,特别是在处理并发事务和解决性能问题时。当多个用户或进程同时访问同一资源时,可能会出现锁冲突,导致某些事务等待,影响数据库的正常运行。了解如何...

    lock_table.rar_Table_lock table_oracle lock table

    例如,可以使用`V$SESSION`和`USER_LOCKS`视图来获取当前会话的锁定信息,或者使用`DBA_LOCKED_OBJECTS`来查看所有被锁定的对象及其状态。 3. **查詢那位使用者鎖住那個tables(詳細).sql**:这个文件可能包含了一个...

    Oracle的锁表与解锁

    锁可以分为行级锁(Row Level Lock)和表级锁(Table Level Lock),以及更细粒度的锁类型。本文将深入探讨Oracle中的锁机制,特别是如何锁表与解锁,以及相关的SQL查询语句,帮助数据库管理员和开发人员更好地理解...

    oracle锁表及解锁

    此查询提供了关于锁定表的信息,包括会话用户、锁的类型、对象所有者、对象名和类型、会话ID、序列号、终端、机器、程序和操作系统用户。 另一个查询方法是通过`v$locked_object`视图: ```sql SELECT p.spid, c....

    怎样查找锁与锁等待及杀特定会话

    此查询的结果包含了每个锁的详细信息,如用户名、锁的级别(表级或行级)、对象的所有者、对象名称、对象类型以及会话的相关信息等。 ##### 2.2 查找锁等待 当存在锁等待情况时,我们需要知道哪些会话锁定了表以及...

    ABAP 面试问题及答案

    锁对象(Lock Object) 锁对象是一種机制,用于控制对某个数据的访问。ABAP 程序中可以使用锁对象来设锁,防止其他用户同时访问同一个数据。锁对象可以分為共享锁和独占锁两种。共享锁用于读取数据,独占锁用于修改...

    oracle中判断表是否被锁

    - `LOCK_ID1`和`LOCK_ID2`: 锁的唯一标识符。 2. **锁模式解释**: - **None (0)**:没有锁。 - **Null (1)**:无效值。 - **Row-S(SS) (2)**:共享行锁。 - **Row-X(SX) (3)**:排他行锁。 - **Share (4)**...

    怎么快速查找锁与锁等待

    此查询返回了所有正在进行锁操作的会话的信息,包括用户名、锁类型(表锁或行锁)、对象所有者、对象名、对象类型以及会话ID等相关信息。 ### 查询被锁定的对象 除了了解哪些会话正在执行锁操作外,还可能需要知道...

    查看数据库锁和解锁方法

    上述查询主要从`v$lock`视图中获取锁的信息,并通过连接`v$session`视图和`dba_objects`表来获取更多的上下文信息,比如会话ID、序列号和锁定的对象名称等。 #### 三、解锁方法 接下来,我们看看如何解锁。在...

    锁表的SESSION处理方法

    这个查询会返回被锁定对象的所有者、对象名、回滚段号、槽号、序列号、锁定SESSION的ID、用户名、锁定类型(如行级锁、表级锁或共享锁)、用户组、机器名、系统用户名、进程ID、活动状态、服务器、SID、序列号、连接...

    ABAP 面试题

    一、锁对象(Lock Object)和 Function Module * 锁对象是用于锁管理的重要工具,创建锁对象时,系统会自动生成两个 Function Module:ENQUEUE_<锁对象名> 和 DEQUEUE_<锁对象名>。 * ENQUEUE_<锁对象名> 用于在锁...

    oracle锁表处理

    1. **分析锁状态**:首先,我们需要收集有关当前锁定情况的信息,包括哪些对象被锁定、哪个会话持有锁以及锁的类型等。这可以通过查询几个重要的视图来实现: - `v$locked_object`:显示当前被锁定的对象。 - `v$...

    查看数据表锁及解锁

    - **其他类型的锁**:如模式对象锁等。 **2. 锁模式:** - **Row-S(SS)**:共享模式下的行级锁。 - **Row-X(SX)**:排他模式下的行级锁。 - **Share**:共享锁。 - **S/Row-X(SSX)**:共享锁和排他行锁的组合。 - *...

    Design patterns for concurent objects

    **读写锁模式(Read-Write Lock Pattern):** 读写锁是一种特殊的锁,它允许多个读取者同时访问共享资源,但在任何时刻只允许一个写入者访问。这提高了程序的并发性,因为多个读取者可以同时进行读操作而不会互相...

    oracle 解锁 语句

    - **锁定(Lock)**:锁定是在数据库对象上设置的一种机制,用于控制对数据的并发访问。 - **会话(Session)**:会话是用户与数据库之间的交互过程。每个登录到数据库的用户都会创建一个新的会话。 - **事务...

    Oracle杀锁的语句

    - `locked_mode`: 锁定模式,如1表示行共享锁(Row Share Lock),6表示排他锁(Exclusive Lock)等。 通过这个查询结果,我们可以快速定位哪些会话正在锁定特定的对象,并进一步分析这些锁定的原因及其影响范围。 ...

    orcale查看锁表与解表语句

    6. **`all_objects`表**:此数据字典视图包含了数据库中所有的对象信息,如所有者、对象类型和名称。结合`v$locked_object`,可以确定被锁定对象的实际名称。 7. **`v$session_wait`表**:这个视图显示了当前会话...

    oracle 数据源

    V$LOCK 视图提供了当前数据库中的锁信息,包括锁的类型、锁的模式、锁定的对象等信息。通过分析 V$LOCK 视图,可以快速地检测到数据库中的锁问题,避免锁问题对数据库的影响。 在给定的 SQL 语句中,使用了多个 ...

    oracle查看被锁的表和解锁

    FROM v$locked_object a, dba_objects b WHERE b.object_id = a.object_id; ``` 这条语句能够帮助我们找出当前被锁定的对象(表),并显示锁定该对象的会话ID(`session_id`)以及锁定模式(`locked_mode`)。其中...

Global site tag (gtag.js) - Google Analytics