Java多线程3
发布日期:2021-04-30 21:04:44 浏览次数:100 分类:精选文章

本文共 2706 字,大约阅读时间需要 9 分钟。

Java多线程3:线程同步与资源共享的实现方法

在线程编程中,资源共享是一个常见的问题。当多个线程同时访问共享资源时,可能会出现数据不一致等问题。为了解决这些问题,我们需要学习线程同步的知识。

线程同步的必要性

当多个线程同时访问同一个资源时,会产生数据不一致的错误情况。例如,在多个窗口同时卖票时,可能出现某个窗口卖出票数为负的情况。为了确保资源的正确使用和避免数据错误,我们需要学习线程同步。

线程同步的实现方式

线程同步可以通过两种方式实现:synchronized关键字和Lock接口。

1. 使用synchronized关键字

synchronized关键字可以修饰方法或代码块,实现对资源的同步访问。

使用synchronized代码块

synchronized代码块需要指定一个同步对象。通常我们会指定this对象作为同步对象。

public class SynchronizedDemo1 implements Runnable {
private int piao = 5;
@Override
public void run() {
String name = Thread.currentThread().getName();
boolean flag = true;
while (flag) {
synchronized (this) {
if (piao > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
piao--;
System.out.println(name + "卖出一张票,还剩" + piao + "张!");
} else {
flag = false;
}
}
}
}
}

使用synchronized方法

synchronized方法可以修饰任何一个方法,自动对方法的执行加锁。

public class SynchronizedMethodDemo2 implements Runnable {
private int piao = 5;
private boolean flag = true;
@Override
public void run() {
String name = Thread.currentThread().getName();
while (flag) {
sellpiao(name);
}
}
private synchronized void sellpiao(String name) {
if (piao > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
piao--;
System.out.println(name + "卖出一张票,还剩" + piao + "张!");
} else {
flag = false;
}
}
}

2. 使用Lock接口

Lock接口提供了一种更灵活的锁定机制,允许我们手动管理锁的获取和释放。

public class LockDemo implements Runnable {
private int piao = 5;
private Lock lock2 = new ReentrantLock();
@Override
public void run() {
String name = Thread.currentThread().getName();
boolean falg = true;
while (falg) {
lock2.lock();
if (piao > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
piao--;
System.out.println(name + "卖出一张票,还剩" + piao + "张");
} else {
falg = false;
}
lock2.unlock();
}
}
}

Lock接口的优势

  • 灵活性:Lock接口允许我们创建多个锁对象,每个锁可以独立管理。
  • 可重入性:ReentrantLock支持可重入锁,同一线程可以多次获取锁。
  • 异常安全:如果线程中断,Lock会自动释放锁。

总结

通过以上方法,我们可以实现线程同步。synchronized关键字提供了一种简单直接的方式,而Lock接口则提供了更灵活的锁定机制。选择哪种方式取决于具体的需求和场景。

上一篇:BigDecimal类
下一篇:【Java2】包/类,运算符,if/switch,for/while

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2026年05月24日 19时50分56秒