Java多线程进一步的理解------------实现读写锁
public class ReadAndWriteLock { public static void main(String[] args) { final QueueJ q = new QueueJ(); for (int i = 0; i <3 ; i++) { new Thread(){ @Override public void run() { while (true) { q.get(); } } }.start(); new Thread(){ @Override public void run() { q.put(new Random().nextInt(1000)); } }.start(); } } } class QueueJ { private Object data = null;//共享数据,只能有一个线程 private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); public void get() { rwl.readLock().lock(); try { System.out.println(Thread.currentThread().getName() + "will read"); Thread.sleep((long)(Math.random()*1000)); System.out.println(Thread.currentThread().getName() + "have read"); }catch (InterruptedException e) { e.printStackTrace(); }finally { rwl.readLock().unlock(); } } public void put(Object data) { rwl.writeLock().lock(); try { System.out.println(Thread.currentThread().getName() + "will write"); Thread.sleep((long)(Math.random()*1000)); this.data = data; System.out.println(Thread.currentThread().getName() + "have write"); }catch (InterruptedException e){ e.printStackTrace(); }finally { rwl.writeLock().unlock(); } } }
读之前,加上读锁,写之前加上写锁
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java多线程进一步理解之----------线程共享数据
说起线程共享数据有几种方式, 1.使用公共集合类来实现,代码很简单就不多解释: public class TestThreadShareData { private static int data = 0; private static Map<Thread,Integer> map = new HashMap<Thread,Integer>(); public static void main(String[] args) { for (int i = 0; i < 2; i++) { new Thread(new Runnable() { @Override public void run() { data = new Random().nextInt(); map.put(Thread.currentThread(), data); System.out.println("main" + Thread.currentThread().getName() + "data=" + data); new A().get(); new B().get(); ...
- 下一篇
Java多线程进一步的理解之------------线程池
public class ThreadPoolTest { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 1; i <=10 ; i++) { final int task = i; executorService.execute(new Runnable() { @Override public void run() { for (int j = 1; j <= 10; j++) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is for " + " j= " + j +" task = " + task); } } }); } //executor...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8编译安装MySQL8.0.19