JUC-6.同步锁Lock
程序员文章站
2022-03-09 18:58:02
...
1. 用于解决多线程安全的问题的方式
1.1. 内置锁:关键字synchronized
- 同步代码块
- 同步方法
/**
* 内置锁:synchronized关键字
* @author xiaobin
* @date 2018/3/11
*/
public class TestSynchronize {
public static void main(String[] args) {
SynchronizedDemo synchronizedDemo = new SynchronizedDemo();
synchronizedDemo.methedA();
synchronizedDemo.methedB();
}
}
class SynchronizedDemo {
public String str = "aa";
/**
* 同步代码块
*/
public void methedA() {
synchronized (this) {
str += "bb";
}
}
/**
* 同步方法
*/
public synchronized void methedB() {
str += "cc";
}
}
1.2. 同步锁Lock
jdk1.5之后才有,是一个显示锁,需要通过lock()方法上锁,必须通过在finally语句块unlock()方法进行释放锁。
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 同步锁Lock
* @author xiaobin
* @date 2018/3/11
*/
public class TestLock {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(ticket,"1号窗口").start();
new Thread(ticket,"2号窗口").start();
new Thread(ticket,"3号窗口").start();
}
}
class Ticket implements Runnable {
private int tick = 100;
private Lock lock = new ReentrantLock();
@Override
public void run() {
lock.lock();
try {
while (tick > 0) {
System.out.println(Thread.currentThread().getName()
+ " 完成售票,余票为:" + --tick);
}
} finally {
lock.unlock();
}
}
}
1.3 分布式锁
在集群环境下,如果多台机器需要对相同数据或资源进行操作。需要通过分布式锁进行加锁。具体实现方式可以借助数据库、redis、zk等进行实现。
上一篇: Lock