Java中synchronization的三种应用方式
1 :synchronization的三种修饰情况(为什么使用synchronization:避免多线程同时访问共享资源时造成的并发问题)
1.1:修饰实例方法,作用与当前的实例加锁,进入同步代码前要获得当前实例的锁
如下代码未使用synchronization进行修饰时
结果为什么出现 192924 而不是期望值 200000:当线程 t1,t2,同时操作 i 时,i为共享的资源;
线程执行分为2 步,第一步为 获取 i 的值,第二步为 i++
可能出现当 线程 t1 获取 i 时还未执行完 i++这个过程中,线程 t2 也获得了 i ,接着也继续执行;
例如:t1 获取 i = 100 时,未执行 i++,t2 也获取 i=100,当t1,t2都执行完此次 i ++ 时,i=101并不是
102,所有循环完的结果 < 200000;
方法加上 synchronization进行修饰,如下:
执行结果始终都是 200000, 在synchronization修饰实例方法;例如 当线程 t1 调用add()方法时,活产生实例对象 s1 的对象锁,只有当线程
t1 执行完成后,才会释放该对象锁,之后线程 t2 获取该对象锁,不会出现同一时刻,线程 t1,t2 同时获取共享资源执行 i++的情况,所有
i 的结果始终都是 200000;
1.2:修饰静态方法,作用于当前类对象的实例,进入同步代码前要获取当前类对象的锁
两个新实例操作同一共享资源且为修饰非静态方法
并未出现期望值20000,因为 s1,s2 为不同的实例,在执行同步代码前获取的不是同一个对象锁,对应的分别是 s1, s2 各自的对象锁,
共享资源 i 并没有被对象锁锁住;
静态( static +synchronized ) 修饰方法,那么该同步代码只有一个锁,就是当前类的对象锁,线程 t1,t2 执行代码前获得的对象锁都是当前类
的对象锁,必须是一个执行完释放该锁,另一个才能重新获取该对象锁进行执行
1.3 :synchronized修饰代码块
- Java高级应用---线程的三种创建方式
- 将Java web应用部署到Tomcat 及部署到Tomcat根目录 的三种方式
- JAVA中数据库操作的各种方式与设计模式的应用
- JAVA中操作数据库方式与设计模式的应用
- 浅析iPhone平台三种应用类型的布局方式
- JAVA中数据库操作的各种方式与设计模式的应用
- tomcat部署web应用的三种方式
- 关于Android中Java调用外部命令的三种方式
- 部署WEB应用的三种方式
- 正则的java中的三种应用
- web应用中三种数据共享方式:request,session,application
- tomcat部署web应用的三种方式
- Java和SAP的三种数据通信方式RFC IDOC XI
- java中三种字符串正则匹配方式
- JAVA实现图片处理缩略图-三种开源实现方式
- java解析xml文件(三种方式-(dom ,jdom ,dom4j)
- Javascript三种文字编码方式(对应java里的编解码)
- JAVA操作数据库方式与设计模式应用--数据库连接池技术
- 对于实现Java平台的三种方式的详细解析
- 驱动和应用层的三种通信方式