关于java对资源加锁无效的问题
来源:互联网 发布:网络言情作者排行榜 编辑:程序博客网 时间:2024/06/06 14:00
看编程思想一书,也写了段代码,发现对static的资源加锁无效,左思右想终于找出了原因,现贴出与大家分享。
import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;class Source{int i=0;}class Generator{public static Integer i=0;public static Source source=new Source();public static Boolean isCancelled=false;public int next(){/** * 无效的资源加锁 */synchronized(i){i++;Thread.yield();i++;return i;}/** * 有效的资源加锁 *///synchronized(source)//{//source.i++;//Thread.yield();//source.i++;//return source.i;//}}}class Increase implements Runnable {int id;Generator gen;public Increase(Generator gen,int id){this.gen=gen;this.id=id;}@Overridepublic void run() {while(gen.isCancelled==false){int val=gen.next();if(val%2!=0){gen.isCancelled=true;print("#"+id+" error. val="+val);}}print("#"+id+" complete. gen:"+gen.next());//print("#"+id+" complete. gen.i:"+gen.i.);}public static void print(Object obj){System.out.println(obj);}}public class TestLock{static ExecutorService exec = Executors.newCachedThreadPool();public static void main(String[] args){ExecutorService exec = Executors.newCachedThreadPool();Generator gen=new Generator(); for(int i = 0; i < 10; i++) exec.execute(new Increase(new Generator(), i)); exec.shutdown();}}
资源加锁的关键是确定所加锁的资源是否是唯一的,是否的分配的唯一内存地址的资源;
上面的无效加锁原因是:static对基本型i 并没有分配内存,而对于封装了的资源source
则用new关键字进行了初始化,并拥有唯一内存,因此对source的加锁才是对单一资源的加锁;
而对于资源i ,10个线程有10个i到底是对谁加锁呢?等于是没有加锁。
(有不恰当处,欢迎吐槽!!!)
- 关于java对资源加锁无效的问题
- java多线程以及资源加锁
- java 对文件进行加锁
- 关于ModifyStyleEx无效的问题
- 关于ORACLE的隔离级别和加锁问题
- 关于在Java中使用request.getRequestDispatcher(".....")引起的css文件无效或图片无效问题。
- 2011-09-07 java多线程临界资源同步和调度问题,遇到困难加锁和解锁问题
- java加锁的意义
- 资源加锁
- 关于在IE下对Select标签设置innerHTML无效的问题
- 关于在IE下对Select标签设置innerHTML无效的问题
- 关于在IE下对Select标签设置innerHTML无效的问题
- 关于在IE下对Select标签设置innerHTML无效的问题
- oracle关于加锁的讨论
- 互斥资源加锁的实现方式
- 关于 [无效的 FORMATETC 结构] 的问题
- 关于PullToRefresh的setOnTouchListener()无效的问题。
- JAVA程序对MYSQL数据库加锁实验
- 七夕,你拿什么拯救你的爱人?
- 不依赖任何js框架的日期控件My97 DatePicker——支持小时、分钟、秒钟
- CentOS 6.2 下安装Java jdk 6
- android屏蔽home键
- Install load test reports
- 关于java对资源加锁无效的问题
- JAVA类库使用与学习记录
- tslib机制分析
- cygwin安装过程总结
- HDU4268 2012ACM长春赛区网络赛 Alice and Bob
- HDU4292 网络流 2012 ACM/ICPC Asia Regional Chengdu Online1005
- 在matlab中把矩阵保存为二进制文件,在c中打开的方法
- android dialog ——列表项带图标的列表对话框、模拟菜单项带
- Kalman滤波 Matlab仿真