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接口则提供了更灵活的锁定机制。选择哪种方式取决于具体的需求和场景。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2026年05月24日 19时50分56秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
php csv 导出
2023-02-27
php include和require
2023-02-27
php mysql优化方法_MySQL优化常用方法
2023-02-27
PHP OAuth 2.0 Server
2023-02-27
PHP pcntl_fork不能在web服务器中使用的变通方法
2023-02-27
php private ,public protected三者的区别
2023-02-27
php PSR规范
2023-02-27
php redis(2)
2023-02-27
PHP Redis分布式锁
2023-02-27
PHP SOAP模块的使用方法:NON-WSDL模式
2023-02-27
PHP SPL标准库-迭代器
2023-02-27
php zookeeper实现分布式锁
2023-02-27
PHP 使用 $_SERVER['PHP_SELF'] 获取当前页面地址及其安全性问题
2023-02-27
php 反射
2023-02-27
PHP 实现N阶矩阵相乘
2023-02-28
php 延迟静态绑定static关键字
2023-02-28
Redis入门
2023-02-28
PHP 截取字符串乱码的解决方案
2023-02-28