2.2.7锁定非this对象synchronized(this)
来源:互联网 发布:软件测试通过的标准 编辑:程序博客网 时间:2024/06/08 18:53
package cha02.execise17;/** * Created by sunyifeng on 17/9/25. */public class Service { private String usernameParam; private String passwordParam; private String anyString = new String(); public void setPasswordParam(String usernameParam, String passwordParam){ try{ synchronized (anyString){ System.out.println("进入线程名称为:" + Thread.currentThread().getName()); this.usernameParam = usernameParam; Thread.sleep(3000); this.passwordParam = passwordParam; System.out.println("离开线程名称为:" + Thread.currentThread().getName()); } }catch (InterruptedException e){ e.printStackTrace(); } }}
package cha02.execise17;/** * Created by sunyifeng on 17/9/25. */public class ThreadA extends Thread { private Service service; public ThreadA(Service service) { super(); this.service = service; } @Override public void run() { service.setPasswordParam("a", "aa"); }}
package cha02.execise17;/** * Created by sunyifeng on 17/9/25. */public class ThreadB extends Thread { private Service service; public ThreadB(Service service) { super(); this.service = service; } @Override public void run() { service.setPasswordParam("b", "bb"); }}
package cha02.execise17;/** * Created by sunyifeng on 17/9/25. */public class Run { public static void main(String[] args) { Service service = new Service(); // 线程A ThreadA threadA = new ThreadA(service); threadA.setName("A"); threadA.start(); // 线程B ThreadB threadB = new ThreadB(service); threadB.setName("B"); threadB.start(); }}
运行结果:进入线程名称为:A
离开线程名称为:A
进入线程名称为:B
离开线程名称为:B
程序分析:
如果类中有多个同步方法,这时虽然能实现同步,但会受到影响,如果使用非this对象,则可以实现异步,提高运行效率。
更改以上代码如下:
package cha02.execise17;/** * Created by sunyifeng on 17/9/25. */public class Service { private String usernameParam; private String passwordParam; public void setPasswordParam(String usernameParam, String passwordParam){ try{ String anyString = new String(); // FIXME: 注意这里 synchronized (anyString){ System.out.println("进入线程名称为:" + Thread.currentThread().getName()); this.usernameParam = usernameParam; Thread.sleep(3000); this.passwordParam = passwordParam; System.out.println("离开线程名称为:" + Thread.currentThread().getName()); } }catch (InterruptedException e){ e.printStackTrace(); } }}
运行结果如下:进入线程名称为:A
进入线程名称为:B
离开线程名称为:A
离开线程名称为:B
程序分析:
使用synchronized(非this)锁,对象监视器必须是同一个对象。以上anyString放在方法内部创建,线程每次进来都是不同对象。
阅读全文
0 0
- 2.2.7锁定非this对象synchronized(this)
- 多线程之synchronized(this)锁定当前对象
- 2.2.6对象锁synchronized(this)锁定的是当前对象
- Java 多线程 (PART XI)synchronized(IV)关于synchronized(非this对象X)
- synchronized(this)
- synchronized(this)
- synchronized(this)
- Java 多线程 (PART XII)synchronized(V) 非this 对象X和String常量池
- 从头认识多线程-2.12 synchronized标记的方法和synchronized(this)标记的代码块锁定的是当前对象
- 多线程 synchronized(this)与 synchronized(非this)同步代码块的区别
- synchronized锁方法,synchronized锁对象,synchronized(this),synchronized(class)最佳理解方式
- 2.2.5一个对象不同的方法synchronized (this)是同一个对象锁
- synchronized(this)与synchronized(class)
- synchronized(this)与synchronized(class)
- synchronized(this)与synchronized(class)
- synchronized(this)与synchronized(class)
- synchronized (class) 和synchronized (this)
- synchronized(class)与synchronized(this)
- Jar/War/Ear等包的作用与区别详解
- 基数排序
- Java 重写(Override)与重载(Overload)
- 网络不稳定导致服务器SSH连接不稳定解决办法
- 第五周项目2-建立链栈算法库
- 2.2.7锁定非this对象synchronized(this)
- XZ_iOS之将图片保存到手机导致崩溃的问题
- 洛谷 P1609 最小回文数
- 如何用centos 7 搭建自己的vpn(以及自己在用的时候出现的坑)
- FreeRTOS 任务优先级问题
- Eclipse配置Tomcat和JDK方法
- Python学习笔记(二)
- 浅谈EasyUI常用控件的禁用方法
- MAC 更改mysql初始密码,亲测ok