对并发读的情况进行测试:
public class SynchronizedDemo { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) throws Exception { Data data = new Data(); Worker t1 = new Worker(data, true, "t1"); Worker t2 = new Worker(data, true, "t2"); t1.start(); t2.start(); } static class Worker extends Thread { Data data; boolean read; public Worker(Data data, boolean read, String threadName) { super(threadName); this.data = data; this.read = read; } public void run() { if (read) data.get(); else data.set(); } } /** * 数据类 */ static class Data { /** * 写数据 */ public synchronized void set() { System.out.println(Thread.currentThread().getName() + " set:begin " + sdf.format(new Date())); try { Thread.sleep(5000); } catch (Exception e) { } finally { System.out.println(Thread.currentThread().getName() + " set:end " + sdf.format(new Date())); } } /** * 读数据 */ public synchronized int get() { System.out.println(Thread.currentThread().getName() + " get :begin " + sdf.format(new Date())); try { Thread.sleep(5000); } catch (Exception e) { } finally { System.out.println(Thread.currentThread().getName() + " get :end " + sdf.format(new Date())); } return 1; } } }
synchronized执行的结果:
t1 get :begin 2013-05-06 22:57:50
t1 get :end 2013-05-06 22:57:55
t2 get :begin 2013-05-06 22:57:55
t2 get :end 2013-05-06 22:58:00
t1先执行,t1 结束后;t2再开始执行,直到结束。对象的方法中一旦加入synchronized修饰,则任何时刻只能有一个线程访问synchronized修饰的方法,所以我们看到结果中是串行执行的。
public class ReadWriteLockDemo { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) throws Exception { Data data = new Data(); Worker t1 = new Worker(data, true, "t1"); Worker t2 = new Worker(data, true, "t2"); t1.start(); t2.start(); } static class Worker extends Thread { Data data; boolean read; public Worker(Data data, boolean read, String threadName) { super(threadName); this.data = data; this.read = read; } public void run() { if (read) data.get(); else data.set(); } } /** * 数据类 */ static class Data { ReadWriteLock lock = new ReentrantReadWriteLock(); Lock read = lock.readLock(); Lock write = lock.writeLock(); /** * 写数据 */ public void set() { write.lock(); System.out.println(Thread.currentThread().getName() + " set:begin " + sdf.format(new Date())); try { Thread.sleep(5000); } catch (Exception e) { } finally { System.out.println(Thread.currentThread().getName() + " set:end " + sdf.format(new Date())); write.unlock(); } } /** * 读数据 */ public int get() { read.lock(); System.out.println(Thread.currentThread().getName() + " get :begin " + sdf.format(new Date())); try { Thread.sleep(5000); } catch (Exception e) { } finally { System.out.println(Thread.currentThread().getName() + " get :end " + sdf.format(new Date())); read.unlock(); } return 1; } } }
使用读锁的执行结果:
t1 get :begin 2013-05-06 23:00:41
t2 get :begin 2013-05-06 23:00:41
t1 get :end 2013-05-06 23:00:46
t2 get :end 2013-05-06 23:00:46
这两个线程同时开始,同时结束。读锁允许多个线程共同读取资源(没有其他线程获取到写锁或者没有正在写数据)。
相关推荐
Java并发编程系列- synchronized;Java并发编程系列- synchronized;Java并发编程系列- synchronized;
│ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲...
并发编程关键字
深入java并发编程,使用ReentrantLock和 Synchronized加锁
Java并发编程---synchronized关键
java高级技术JUC高并发编程教程2021(1.5G) 〖课程介绍〗: java高级技术JUC高并发编程教程2021(1.5G) 〖课程目录〗: 01-JUC高并发编程-课程介绍.mp4 02-JUC高并发编程-JUC概述和进程线程概念(1).mp4 03-JUC...
│ 高并发编程第一阶段25讲、多Produce多Consume之间的通讯导致出现程序假死的原因分析.mp4 │ 高并发编程第一阶段26讲、多线程下的生产者消费者模型,以及详细介绍notifyAll方法.mp4 │ 高并发编程第一阶段27讲...
这篇指南主要是为帮助java多线程开发人员理解并发的核心概念以及如何应用这些理念。本文的主题是关于具有java语言风格的Thread、synchronized、volatile,以及J2SE5中新增的概念,如锁(Lock)、原子性(Atomics)、并发...
本书全面介绍了如何使用Java 2平台进行并发编程,较上一版新增和扩展的内容包括:, ·存储模型 ·取消 ·可移植的并行编程 ·实现并发控制的工具类, Java平台提供了一套广泛而功能强大的api,工具和技术。...
java7在并发编程方面,带来了很多令人激动的新功能,这将使你的应用程序具备更好的并行任务性能。 《Java 7并发编程实战手册》是Java 7并发编程的实战指南,介绍了Java 7并发API中大部分重要而有用的机制。全书分为9...
你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它? 3)在 java 中 wait 和 sleep 方法的不同? 4)用 Java 实现阻塞队列。 5)用 Java 写代码来解决生产者...
并发编程原理学习:synchronized关键字.doc
1、本资源包含并发编程基础知识的使用案例,包括:线程创建、Synchronized和Reentrantlock锁的使用、线程安全问题演示、Condition的应用、CountDownLatch的应用、Cyclicbarrier的应用、Semaphore的应用、线程池的...
关联自己的博客《并发编程(一)》中的附件,主要提供一些demo供大家演示和使用,主要涉及一些并发的一些的基本使用,包括synchronized关键字、volatile关键字。
并发编程:编写多线程代码,解决多线程带来的问题 为什么要学并发编程? 首先,来看一个案例:手写网站服务器案例。 高性能应用程序的一把钥匙,应用程序的翅膀,面试高频的考点 中间件几乎都是多线程应用:MySQL、...
并发编程模型: 介绍不同的并发编程模型,如多生产者多消费者、读者写者、线程池等。 volatile 关键字: 解释 volatile 关键字的作用,探讨如何使用 volatile 实现线程间的可见性和有序性。 通过这份资源,将为您...
7、并发工具类CountDownLatch 、CyclicBarrier和Semaphore底层实现原理 8、线程池原理和如何使用线程池 9、ThreadLocal 为什么会内存泄漏 10、Volatile底层实现原理 11、AQS源码分析 12、CAS原理分析和使用场景 13、...
【Java并发编程】Synchronized关键字实现原理.doc
java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...
读者将通过使用java.lang.thread类、synchronized和volatile关键字,以及wait、notify和notifyall方法,学习如何初始化、控制和协调并发操作。此外,本书还提供了有关并发编程的全方位的详细内容,例如限制和同步、...