在java中,多线程加锁的方式主要有以下几种:
1. 使用synchronized关键字
synchronized可以用于方法或代码块,确保只有一个线程能访问被锁定的代码。
方法锁
class synchronizedmethod {
public synchronized void synchronizedmethod() {
system.out.println("synchronized method executed by " + thread.currentthread().getname());
}
}
代码块锁
class synchronizedblock {
private final object lock = new object();
public void synchronizedblock() {
synchronized (lock) {
system.out.println("synchronized block executed by " + thread.currentthread().getname());
}
}
}
2. 使用reentrantlock类
reentrantlock是java.util.concurrent.locks包中的一种锁,具有比synchronized更灵活的锁定机制。
import java.util.concurrent.locks.reentrantlock;
class reentrantlockexample {
private final reentrantlock lock = new reentrantlock();
public void lockmethod() {
lock.lock();
try {
system.out.println("reentrantlock method executed by " + thread.currentthread().getname());
} finally {
lock.unlock();
}
}
}
3. 使用读写锁(readwritelock)
readwritelock允许多个读线程同时访问共享资源,但在写线程访问时,阻止其他线程的读和写访问。
import java.util.concurrent.locks.readwritelock;
import java.util.concurrent.locks.reentrantreadwritelock;
class readwritelockexample {
private final readwritelock readwritelock = new reentrantreadwritelock();
public void readmethod() {
readwritelock.readlock().lock();
try {
system.out.println("read lock method executed by " + thread.currentthread().getname());
} finally {
readwritelock.readlock().unlock();
}
}
public void writemethod() {
readwritelock.writelock().lock();
try {
system.out.println("write lock method executed by " + thread.currentthread().getname());
} finally {
readwritelock.writelock().unlock();
}
}
}
4. 使用信号量(semaphore)
semaphore是一种计数信号量,可以限制同时访问某个资源的线程数量。
import java.util.concurrent.semaphore;
class semaphoreexample {
private final semaphore semaphore = new semaphore(2); // 允许最多两个线程访问
public void accessresource() {
try {
semaphore.acquire();
system.out.println("accessing resource by " + thread.currentthread().getname());
thread.sleep(1000); // 模拟工作
} catch (interruptedexception e) {
e.printstacktrace();
} finally {
semaphore.release();
}
}
}
总结
synchronized是 java 内置的关键字,易于使用,但灵活性不足。reentrantlock提供了更强大的锁控制能力,如可重入锁、超时锁。readwritelock允许更高效地处理读写操作,适用于读多写少的场景。semaphore可以控制访问资源的线程数量,适合有限资源的场景。
这些加锁机制可以帮助你在多线程环境中实现线程安全的访问
到此这篇关于java中多线程加锁的四种方式的文章就介绍到这了,更多相关java 多线程加锁内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论