- import java.util.concurrent.atomic.AtomicBoolean;
-
-
-
-
- public class Lock {
-
- private AtomicBoolean lock = new AtomicBoolean(true);
-
- public boolean tryLock() {
- return lock.compareAndSet(true, false);
- }
-
- public void unlock() {
- lock.set(true);
- }
-
- }
原理:CAS
优点:
速度快,约是ReentrantLock的2-3倍
缺点:
需JDK5.0+
无条件对象且不可重入
未获取锁时直接调用unlock不抛IllegalMonitorStateException所以代码必须严格保证获取锁后才能调用unlock
适用场景:
不需要条件对象且当ReentrantLock的tryLock影响了你的性能的时候
我的应用场景:
最近项目中通信程序中的客户端的socket长连接的连接池,客户端使用连接具有高并发但占用连接时间非常短的特点,使用这个类代替ReentrantLock,性能提高了3倍左右。
- import java.util.concurrent.locks.ReentrantLock;
-
-
-
-
- public class TestLock {
-
- private static long c = 0;
- public static void main(String[] args) {
- final Lock l = new Lock();
-
- Thread t1 = new Thread() {
- public void run() {
- for (int i = 0; i < 100000000;) {
- if (l.tryLock()) {
- c++;
- i++;
- l.unlock();
- }
- }
- }
- };
- Thread t2 = new Thread() {
- public void run() {
- for (int i = 0; i < 100000000;) {
- if (l.tryLock()) {
- c++;
- i++;
- l.unlock();
- }
- }
- }
- };
- long t = System.currentTimeMillis();
- Thread t3 = new Thread() {
- public void run() {
- for (int i = 0; i < 100000000;) {
- if (l.tryLock()) {
- c++;
- i++;
- l.unlock();
- }
- }
- }
- };
- t1.start();
- t2.start();
- t3.start();
- try {
- t1.join();
- t2.join();
- t3.join();
- } catch (InterruptedException e) {
- }
- System.out.println(c);
- System.out.println(System.currentTimeMillis() - t);
- }
- }
分享到:
相关推荐
tryLock() 仅在调用时锁为空闲状态才获取该锁。如果锁可用,则获取锁,并立即返回值 true。如果锁不可用,则此方法将立即返回值 false。 lock 和 synchronized 都是锁的意思,但是它们有不同的实现机制和应用场景。...
public static boolean tryLock(String lockKey, int expireSeconds) { Jedis jedis = new Jedis("localhost", 6379); String result = jedis.set(lockKey, "locked", "NX", "EX", expireSeconds); jedis.close...
2. **定时等待**:通过`tryLock(long timeout, TimeUnit unit)`方法,线程可以设定一个等待时间去尝试获取锁,如果超时仍未获取到,线程将返回而不是继续等待。 3. **锁投票**:`ReentrantLock`的`tryLock()`方法...
这与`synchronized`块类似,但`ReentrantLock`提供了更细粒度的控制,如尝试非阻塞获取锁(`tryLock()`)、可中断的锁获取(`lockInterruptibly()`)以及对锁状态的查询方法。 总结来说,`ReentrantLock`是Java并发编程...
if (lock.tryLock(1000, TimeUnit.MILLISECONDS)) { // 尝试获取锁,超时时间为1秒 try { // 执行关键代码段 } finally { lock.unlock(); // 释放锁 } } else { System.out.println("Lock acquisition timed...
Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和安全性著称。"Java简单程序小例子"是学习Java编程的初级阶段常见的实践项目,通常包含一系列基础的代码示例,帮助初学者理解语言的基本语法和常用...
例如,`down_trylock()`和`up_read_trylock()`这样的宏可以帮助开发者在某些情况下避免等待锁。 #### 八、结语 《Linux内核同步操作详解》为开发者提供了丰富的理论知识和技术细节,帮助他们在开发驱动程序或其他...
- **Lock锁**:ReentrantLock是可重入锁,提供了比synchronized更细粒度的控制,如tryLock()、unlock()等。 3. **并发工具类** - **CountDownLatch**:用于计数,常用于多线程协同工作,当计数器归零时,所有等待...
其中,`lock`是最常用的一种,用于控制对共享资源的访问。 4. **线程池** 线程池是一种线程复用机制,它可以避免频繁创建和销毁线程的开销。C#的线程池由`ThreadPool`类提供。你可以通过`ThreadPool....
`lock`是C#中实现互斥访问的最简单方式。它基于`Monitor`类,确保同一时刻只有一个线程可以执行锁定的代码块: ```csharp object obj = new object(); lock (obj) { // 共享资源的代码 } ``` 这里,`obj`作为锁...
- **synchronized关键字**:这是最简单的锁实现方式,可以应用于方法或者代码块。 - **ReentrantLock类**:这是一个可重入的互斥锁,比synchronized更灵活,提供了一系列高级功能。 - **ReentrantReadWriteLock类**...
pthread_mutex_trylock用于尝试加锁,而不会阻塞。 2. 条件变量:条件变量是与互斥锁联合使用的同步机制,用于线程间的协调。条件变量允许线程因为某个条件未满足而处于阻塞状态,直到其他线程改变了这个条件并发送...
首先,我们来看最基本的同步机制——synchronized关键字。synchronized可以用于方法或者代码块,当它包裹的代码被执行时,会创建一个监视器锁,只有一个线程能获取这个锁并执行代码,其他线程必须等待锁的释放。例如...
这个简单的实现展示了如何在C++中创建自定义消息系统,包括定义消息结构、存储消息、发送和接收消息以及处理消息的逻辑。通过这种方式,你可以根据项目需求定制自己的通信协议,以实现更高效、更灵活的程序设计。...
- **解答**: 要实现线程之间的执行顺序,最简单的方法是使用`join()`方法。例如: ```java Thread t1 = new Thread(() -> { // T1 的任务 }); Thread t2 = new Thread(() -> { // T2 的任务 }); Thread t3 =...
- 可以通过tryLock尝试获取锁,增加灵活性。 - 提供更精细的锁释放控制,避免异常导致的死锁。 #### 5. 认识AQS - **AQS内部实现**: - 通过`state`字段记录锁的状态,使用CAS操作进行原子更新。 - 通过FIFO...
通常,使用阻塞队列是最简单且高效的解决方案,因为它已经内置了同步和等待机制。然而,在某些特定情况下,如需要更灵活的同步控制或者更高的性能,其他方法可能更合适。理解并熟练掌握这些机制对于进行高并发的Java...
- `lock`是C#中最简单的同步原语,它基于Monitor对象实现: ```csharp lock (obj) { // 访问共享资源的代码 } ``` 5. **线程池** - .NET框架中的线程池(ThreadPool)是一种高效的线程管理机制,它可以重用...
除了基本的线程创建和控制,Java还提供了丰富的同步机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法,以及`Lock`接口(如`ReentrantLock`)和`Condition`接口,以支持更复杂的并发控制。...