java同一个类不同方法间的同步
对象的方法中一旦加入synchronized修饰,则任何时刻只能有一个线程访问synchronized修饰的方法。假设有个数据对象拥有写方法与读方法,多线程环境中要想保证数据的安全,需对该对象的读写方法都要加入 synchronized同步块。这样任何线程在写入时,其它线程无法读取与改变数据;如果有线程在读取时,其他线程也无法读取或写入。这种方式在写入操作远大于读操作时,问题不大,而当读取远远大于写入时,会造成性能瓶颈,因为此种情况下读取操作是可以同时进行的,而加锁操作限制了数据的并发读取。
ReadWriteLock解决了这个问题,当写操作时,其他线程无法读取或写入数据,而当读操作时,其它线程无法写入数据,但却可以读取数据 。
- public class ReadWriteLockDemo {
- static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- public static void main(String[] args) {
- Data data = new Data();
- Worker t1 = new Worker(data,true);
- Worker t2 = new Worker(data,true);
- t1.start();
- t2.start();
- }
- static class Worker extends Thread {
- Data data;
- boolean read;
- public Worker(Data data, boolean read) {
- 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().hashCode()
- + " set:begin " + sdf.format(new Date()));
- try {
- Thread.sleep(5000);
- //
- } catch (Exception e) {
- } finally {
- System.out.println(Thread.currentThread().hashCode() + " set:end "
- + sdf.format(new Date()));
- write.unlock();
- }
- }
- public int get() {
- read.lock();
- System.out.println(Thread.currentThread().hashCode()
- + " get :begin " + sdf.format(new Date()));
- try {
- Thread.sleep(5000);
- //
- } catch (Exception e) {
- } finally {
- System.out.println(Thread.currentThread().hashCode() + " get :end "
- + sdf.format(new Date()));
- read.unlock();
- }
- return 1;
- }
- }
- }
两个线程均是读线程,结果如下
22474382 get :begin 2011-04-16 18:26:13
4699264 get :begin 2011-04-16 18:26:13
22474382 get :end 2011-04-16 18:26:18
4699264 get :end 2011-04-16 18:26:18
两读线程均可同时读取数据,下面看一个是读线程,一个写线程的情况
Data data = new Data();
Worker t1 = new Worker(data,false);
Worker t2 = new Worker(data,true);
t2.start();
Thread.sleep(100);
t1.start();
先启动读取线程,再启动写入线程,看结果
14718739 get :begin 2011-04-16 18:54:46
14718739 get :end 2011-04-16 18:54:51
14737862 set:begin 2011-04-16 18:54:51
14737862 set:end 2011-04-16 18:54:56
可以看到读取线程工作时,写入线程是不能访问数据的
java同一个类不同方法间的同步的更多相关文章
- Java并发之线程间的同步协作与通信协作
1,Monitor监视器与syncrhoized实现原理 1.1:Monitor Monitor是一个同步工具,相当于操作系统中的互斥量(mutex),即值为1的信号量. 它内置与每一个Object对 ...
- Java 同一个类的不同实例对象竟然可以相互访问各自的private成员
如题,在看String源码的某个函数时,发现了这个操作是被允许的,而且可以直接改变private字段(不是final按理是可以改变),这与之前的理解有点相背. 接下来试图整理下Google来的结论: ...
- java同一个类中,构造器如何调用另一个重载的构造器?
构造器里面调用其它构造器,格式方法如下:1.使用this调用另一个重载构造器,只能在构造器中使用:2.必须写在构造器执行体的第一行语句: 示例如下: import static java.lang.S ...
- 《同一个类中不同方法之间的调用相关问题(省略的类名或者this)》
//同一个类中不同方法之间的调用相关问题(省略的类名或者this) class A { public void B() { System.out.println("b方法运行"); ...
- java中方法内可以调用同一个类中的方法
在同一个类中,java的普通方法的相互调用,可以使用this+点号+方法名,也可省略this+点号,java编 译器会自动补上.
- Java中同一个类中不同的synchronized方法是否可以并发执行?
答案是: 不可以,因为都是获取到对象本身的锁. 多个线程访问同一个类的synchronized方法时, 都是串行执行的 ! 就算有多个cpu也不例外 ! synchronized方法使用了类java的 ...
- Java多线程(三) 多线程间的基本通信
多条线程在操作同一份数据的时候,一般需要程序去控制好变量.在多条线程同时运行的前提下控制变量,涉及到线程通信及变量保护等. 本博文主要总结:①线程是如何通信 ②如何保护线程变量 1.Java里的线程 ...
- Java的类演进过程
1.从面向过程到面向对象 在大家最熟悉的C语言中,如果要定义一个复杂的数据类型就用结构体(Struct)来实现,而为结构体的每个操作都定义一个函数,这个函数与结构体本身的定义没有任何关系.程序的重心集 ...
- Java并发——线程安全、线程同步、线程通信
线程安全 进程间"共享"对象 多个“写”线程同时访问对象. 例:Timer实例的num成员,即add()方法是用的次数.即Timer实例是资源对象. class TestSync ...
随机推荐
- Django实现表单验证、CSRF、cookie和session、缓存、数据库多表操作(双下划綫)
通常验证用户输入是否合法的话,是前端js和后端共同验证的,这是因为前端js是可以被禁用的,假如被禁用了,那就没法用js实现验证合法与否了,也就是即使用户输入的不合法,但是也没提示,用户也不知道怎么输入 ...
- HDU 4336 容斥原理 || 状压DP
状压DP :F(S)=Sum*F(S)+p(x1)*F(S^(1<<x1))+p(x2)*F(S^(1<<x2))...+1; F(S)表示取状态为S的牌的期望次数,Sum表示 ...
- BigDecimal
BigDecimal需要创建对象进行计算(用不同的方式做运算) BigDecimal num1 = new BigDecimal("5"): BigDecimal num2 = n ...
- javascript选择器querySelector和querySelectorAll的使用和区别
querySelector 和 querySelectorAll 方法是 W3C Selectors API规范中定义的.他们的作用是根据 CSS 选择器规范,便捷定位文档中指定元素. 目前几乎主流浏 ...
- logstash 添加nginx日志
选择需求分类废话少说直接上图 第一张图: 2.此图搭配的日志格式是: log_format main '$remote_addr - $remote_user [$time_local] $http_ ...
- SILVERLIGHT 应急卫生模拟演练项目之loading界面实现
第一次在博客园写文章 俺是菜鸟 有不足之处还请大佬们多多指教 第一次也不知道该写啥 俺就拿自己最近做的一个项目 来细说吧 俺们公司是做医疗卫生方面的 其中有一块涉及到应急卫生模拟演练方面 这块分到我 ...
- devenv命令详解
devenv [解决方案文件 | 项目文件 | 任意文件.扩展名] [开关] devenv 的第一个参数通常是一个解决方案文件或项目文件. 如果您希望在编辑器中自动打开文件, 也可以使用任何其他文 ...
- OpenGL阴影,Shadow Volumes(附源程序,使用 VCGlib )
实验平台:Win7,VS2010 先上结果截图: 本文是我前一篇博客:OpenGL阴影,Shadow Mapping(附源程序)的下篇,描述两个最常用的阴影技术中的第二个,Shadow Volu ...
- NotePad++ 调试PHP代码中文显示乱码
最近在NotePad++上调试PHP代码,按照示例代码进行调试,结果在显示中文的时候显示一堆乱码,于是上网百度,有2种方法可以解决: 按调试方式有2种方法: 1.菜单插件-NppExec: " ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...