2.2.16锁对象的改变
来源:互联网 发布:美国硕士一年花费知乎 编辑:程序博客网 时间:2024/06/07 04:49
package demo;/** * Created by sunyifeng on 17/10/12. */public class MyService { private String lock = "123"; public void testMethod() { try { synchronized (lock) { System.out.println("线程开始,线程名称:" + Thread.currentThread().getName() + ",当前时间:" + System.currentTimeMillis() + ",lock:" + lock); lock = "456"; Thread.sleep(2000); System.out.println("线程结束,线程名称:" + Thread.currentThread().getName() + ",当前时间:" + System.currentTimeMillis() + ",lock:" + lock); } } catch (InterruptedException e) { e.printStackTrace(); } }}
package demo;/** * Created by sunyifeng on 17/10/12. */public class ThreadA extends Thread { private MyService service; public ThreadA(MyService myService) { super(); this.service = myService; } @Override public void run(){ super.run(); service.testMethod(); }}
package demo;/** * Created by sunyifeng on 17/10/12. */public class ThreadB extends Thread { private MyService service; public ThreadB(MyService myService) { super(); this.service = myService; } @Override public void run(){ super.run(); service.testMethod(); }}
package demo;/** * Created by sunyifeng on 17/10/12. */public class Run1 { public static void main(String[] args) throws InterruptedException{ MyService myService = new MyService(); // ThreadA threadA = new ThreadA(myService); threadA.setName("A"); // ThreadB threadB = new ThreadB(myService); threadB.setName("B"); // threadA.start(); Thread.sleep(50); threadB.start(); }}
运行结果:线程开始,线程名称:A,当前时间:1507826311158,lock:123
线程开始,线程名称:B,当前时间:1507826311212,lock:456
线程结束,线程名称:A,当前时间:1507826313162,lock:456
线程结束,线程名称:B,当前时间:1507826313216,lock:456
程序分析:
线程A持有的对象锁是“123”,进入同步代码块之后,线程A把锁改成“456”,线程B获取的锁是“456”,所以程序是异步执行。
更改代码:
package demo;/** * Created by sunyifeng on 17/10/12. */public class Run1 { public static void main(String[] args) throws InterruptedException{ MyService myService = new MyService(); // ThreadA threadA = new ThreadA(myService); threadA.setName("A"); // ThreadB threadB = new ThreadB(myService); threadB.setName("B"); // threadA.start(); // Thread.sleep(50); // FIXME:注释此行 threadB.start(); }}
运行结果(有时候同步,有时候异步?):线程开始,线程名称:A,当前时间:1507826551481,lock:123
线程结束,线程名称:A,当前时间:1507826553483,lock:456
线程开始,线程名称:B,当前时间:1507826553483,lock:456
线程结束,线程名称:B,当前时间:1507826555487,lock:456
程序分析:
线程A,线程A同时竞争CUP资源,有时候同步执行,有时候异步执行?
阅读全文
0 0
- 2.2.16锁对象的改变
- 2.6锁对象的改变
- Java多线程锁对象的改变
- 多线程 锁对象改变
- 改变对象的字符串提示
- 改变对象的key的名称
- 在数据库中改变对象的所有者
- 即改变引用指向的对象
- 改变ViewStack子对象的创建策略
- 为什么Java的String对象不能改变
- Qt 5中元对象系统的改变
- Qt 5中元对象系统的改变
- String对象不可改变的特性
- 为什么Java的String对象不能改变
- String对象不可改变的特性
- python赋值对象的指向改变规律
- [00801]改变对象的字符串显示
- 38、批量改变对象的属性
- ThreadLocal类
- Android 悬浮窗踩坑体验
- Java 开发工具–Lombok介绍
- linux chmod和文件权限的设定
- php学习笔记:登录练习(3)
- 2.2.16锁对象的改变
- C语言中使用空的宏定义的作用
- 高斯消元法
- Netty源码分析:AbstractByteBuf
- Servlet 工程 web.xml 中的 servlet 和 servlet-mapping 标签
- 利用分治法实现逆序数对的求解
- Docker Tomcat 部署
- ubantu 14.0以上设置永久root账户登入
- [算法笔记]——快速倒数平方根算法