代码是:
package com.eyu.gift.lock;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.locks.LockSupport;
class FailLock {
Queue<Thread> queue = new ConcurrentLinkedQueue<Thread>();
public void lock() {
queue.add(Thread.currentThread());
if (queue.peek() != Thread.currentThread()) {
LockSupport.park(this);
}
}
public void unlock() {
queue.remove();
LockSupport.unpark(queue.peek());
}
}
测试代码:
package com.eyu.gift.lock;
import java.util.concurrent.CountDownLatch;
import org.hamcrest.Matchers;
import org.junit.Assert;
import org.junit.Test;
public class FailLockTest {
public static final int NUM = 5000;
public static final int THREAD_NUM = 40;
static int[] target = new int[THREAD_NUM];
@Test
public void test() throws Exception {
final FailLock failLock = new FailLock();
final CountDownLatch endCountDownLatch = new CountDownLatch(THREAD_NUM);
final CountDownLatch startCountDownLatch = new CountDownLatch(1);
for (int j = 0; j < THREAD_NUM; j++) {
final int thread = j;
Thread t = new Thread() {
@Override
public void run() {
try {
startCountDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < NUM; i++) {
failLock.lock();
++target[thread];
// System.err.println(target[thread] + " ======== " + Thread.currentThread().getName());
failLock.unlock();
}
endCountDownLatch.countDown();
}
};
t.setName("线程" + thread);
t.start();
}
startCountDownLatch.countDown();
endCountDownLatch.await();
int total = 0;
for (int i = 0; i < THREAD_NUM; i++) {
total += target[i];
}
Assert.assertThat(total, Matchers.is(THREAD_NUM * NUM));
}
}
分享到:
相关推荐
下面是一个简单的ReentrantLock公平锁与非公平锁的使用示例: ```java import java.util.concurrent.locks.ReentrantLock; public class LockDemo { private ReentrantLock fairLock = new ReentrantLock(true); ...
在Java并发编程中,理解和掌握并发锁的原理与实现至关重要,因为它们是解决多线程环境下的互斥和同步问题的关键。本文将基于JDK源码解析Java领域中的并发锁,探讨AQS基础同步器、LockSupport、Condition接口、Lock...
分布式锁的实现通常会为每个请求创建一个临时顺序节点,按照创建的顺序形成一个链表。 2. **锁的获取**: 当客户端想要获取锁时,它会在特定的路径下创建一个临时顺序节点。系统会根据节点的创建顺序确定锁的归属,...
`InterProcessMutex`是一个高级接口,用于实现简单易用的分布式锁。它隐藏了底层的ZooKeeper操作,使得开发者只需调用几个方法即可实现分布式锁的获取和释放。 此外,Curator还提供了一些附加功能,如锁的公平性...
Java锁机制是多线程编程中...总结,Java锁机制提供了多种方式来控制并发访问,从简单的synchronized关键字到复杂的显式锁,帮助开发者实现线程安全的代码。理解并熟练运用这些机制,是编写高效、稳定多线程程序的关键。
1. **锁的获取与释放**:工具包通常会提供一个`lock()`方法用于获取锁,以及一个`unlock()`方法用于释放锁。这两个方法内部会处理锁超时、重试等逻辑,确保锁的正确性。 2. **公平性策略**:为了防止死锁和饥饿现象...
在分布式系统中,集群同步锁是一种...这只是一个基础示例,实际项目中可能需要根据业务需求进行更复杂的优化,例如引入锁的公平性策略、分布式信号量等。理解这些概念并熟练运用,对于构建健壮的分布式系统至关重要。
Java提供了synchronized关键字来实现互斥锁,确保同一时刻只有一个线程访问共享资源。此外,ReentrantLock类提供了更细粒度的锁控制,支持公平锁和非公平锁,以及尝试获取锁、可中断等待等功能。 4. 死锁与活锁 ...
本实践项目是关于如何使用线程(Thread)和定时器(Timer)来实现一个简单的缓存同步机制。我们将探讨以下几个关键知识点: 1. **线程基础**: - 在Java中,`Thread`类是线程的基类,通过继承或实现`Runnable`接口...
【中国象棋(简易版)】是一个基于Java SE和MySQL开发的在线双人对战游戏。这个项目的主要目的是通过网络编程技术,使两个玩家能够通过同一个服务器进行实时的棋局互动。下面将详细阐述其中涉及的技术点和实现原理。...
Lock接口提供了更细粒度的锁控制,可以实现公平锁、非公平锁、可重入锁等。Atomic类提供了原子操作,适用于简单的共享变量更新场景。 Java内存模型(JMM)是理解并发编程中内存可见性问题的基础。它定义了线程如何...
在这个场景中,我们关注的是一个使用Java编程语言实现的进程调度程序。Java作为一种跨平台的高级编程语言,非常适合开发这种系统级的应用。 进程调度的主要目标包括提高系统吞吐量、减少进程等待时间以及保持响应...
Lock接口提供了更细粒度的锁控制,如公平锁、非公平锁、读写锁等,允许更加灵活的同步策略。volatile关键字用于确保共享变量的可见性和有序性,避免指令重排序对多线程造成的影响。 此外,Java提供了ThreadLocal...
- **Lock接口与ReentrantLock类**:`java.util.concurrent.locks`包提供了更灵活的锁机制,如`Lock`接口和`ReentrantLock`类,它们可以实现公平锁、非公平锁,以及读写锁等功能。 4. **死锁与活锁** - 死锁:两个...
这个简易模拟售票系统实现是基于Java的并发编程概念,旨在演示如何在多线程环境下确保数据的一致性和正确性。下面我们将深入探讨该系统背后的多线程同步技术。 1. **线程与并发** 在计算机系统中,线程是程序执行...
【标题】"java编写的一个小游戏TurnAround"指出这是一款使用Java编程语言开发的娱乐软件。Java是一种广泛应用的面向对象的编程语言,以其跨平台、安全性和可移植性著称。在游戏开发领域,Java虽然不如C++或Unity等...
例如,如果你需要在等待锁的同时处理中断或者需要更高效的锁竞争策略,`ReentrantLock`是一个好选择。 4. **Semaphore**: Semaphore是一种计数信号量,可以控制同时访问特定资源的线程数量。它适用于限制并发访问...
内置锁简单易用,而显式锁提供了更细粒度的控制,支持公平性、可中断和尝试加锁等特性。 8. **并发模式** 并发编程中有多种设计模式,如生产者消费者模式、读者写者模式、工作窃取模式等,它们是解决并发问题的...
这是通过在工作内存和主内存之间建立一个直接的通信通道来实现的。 8. Java中的ThreadLocal是什么? - ThreadLocal为每个使用该变量的线程提供一个独立的变量副本,每个线程都可以独立地改变自己的副本,而不会...