从头认识多线程-2.12 synchronized标记的方法和synchronized(this)标记的代码块锁定的是当前对象
来源:互联网 发布:字体下载软件 编辑:程序博客网 时间:2024/06/05 00:10
这一章节我们来讨论一下synchronized标记的方法和synchronized(this)标记的代码块锁定的是当前对象。
1.其实从语句上面我们就已经可以看出synchronized(this)锁定的是当前对象,因为能够使用this的只有指代当前对象(当然,在构造器里面有些this除外)
2.代码清单:
package com.ray.deepintothread.ch02.topic_12;/** * * @author RayLee * */public class ObjectLock2 {public static void main(String[] args) throws InterruptedException {MyService2 myService2 = new MyService2();ThreadThree threadThree = new ThreadThree(myService2);Thread thread = new Thread(threadThree);thread.start();ThreadFour threadFour = new ThreadFour(myService2);Thread thread2 = new Thread(threadFour);thread2.start();}}class ThreadThree implements Runnable {private MyService2 myService2;public ThreadThree(MyService2 myService2) {this.myService2 = myService2;}@Overridepublic void run() {try {myService2.updateA();} catch (InterruptedException e) {e.printStackTrace();}}}class ThreadFour implements Runnable {private MyService2 myService2;public ThreadFour(MyService2 myService2) {this.myService2 = myService2;}@Overridepublic void run() {try {myService2.updateB();} catch (InterruptedException e) {e.printStackTrace();}}}class MyService2 {private int count = 0;public synchronized void updateA() throws InterruptedException {System.out.println(this);for (int i = 0; i < 5; i++) {System.out.println("Thread name:" + Thread.currentThread().getName() + " count:" + count++);Thread.sleep(50);}}public synchronized void updateB() throws InterruptedException {System.out.println(this);for (int i = 0; i < 5; i++) {System.out.println("Thread name:" + Thread.currentThread().getName() + " count:" + count++);Thread.sleep(100);}}}
输出:
com.ray.deepintothread.ch02.topic_12.MyService2@9f34d54
Thread name:Thread-0 count:0
Thread name:Thread-0 count:1
Thread name:Thread-0 count:2
Thread name:Thread-0 count:3
Thread name:Thread-0 count:4
com.ray.deepintothread.ch02.topic_12.MyService2@9f34d54
Thread name:Thread-1 count:5
Thread name:Thread-1 count:6
Thread name:Thread-1 count:7
Thread name:Thread-1 count:8
Thread name:Thread-1 count:9
package com.ray.deepintothread.ch02.topic_12;/** * * @author RayLee * */public class ObjectLock {public static void main(String[] args) throws InterruptedException {MyService myService = new MyService();ThreadOne threadOne = new ThreadOne(myService);Thread thread = new Thread(threadOne);thread.start();ThreadTwo threadTwo = new ThreadTwo(myService);Thread thread2 = new Thread(threadTwo);thread2.start();}}class ThreadOne implements Runnable {private MyService myService;public ThreadOne(MyService myService) {this.myService = myService;}@Overridepublic void run() {try {myService.updateA();} catch (InterruptedException e) {e.printStackTrace();}}}class ThreadTwo implements Runnable {private MyService myService;public ThreadTwo(MyService myService) {this.myService = myService;}@Overridepublic void run() {try {myService.updateB();} catch (InterruptedException e) {e.printStackTrace();}}}class MyService {public void updateA() throws InterruptedException {synchronized (this) {long startTime = System.currentTimeMillis();System.out.println("updateA startTime:" + startTime);Thread.sleep(1000);long endTime = System.currentTimeMillis();System.out.println("updateA endTime:" + endTime);}}public void updateB() throws InterruptedException {synchronized (this) {long startTime = System.currentTimeMillis();System.out.println("updateB startTime:" + startTime);Thread.sleep(1000);long endTime = System.currentTimeMillis();System.out.println("updateB endTime:" + endTime);}}}
2.结论
看第一个代码清单,synchronized标记的方法,我们其实比较难发现标记的是当前对象,只有在方法里面打印出来才知道,对比两个对象的内存地址,是一致的
看第二个代码清单,因为直接是引用this,因此肯定是当前对象
总结:这一章节展示了synchronized标记的方法和synchronized(this)标记的代码块锁定的是当前对象。
这一章节就到这里,谢谢
------------------------------------------------------------------------------------
我的github:https://github.com/raylee2015/DeepIntoThread
目录:http://blog.csdn.net/raylee2007/article/details/51204573
- 从头认识多线程-2.12 synchronized标记的方法和synchronized(this)标记的代码块锁定的是当前对象
- 从头认识多线程-2.11 通过同步代码块证明synchronized标记的是对象锁
- 从头认识多线程-2.26 synchronized同步代码块在jvm是怎样执行的?
- java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解
- java 多线程 Synchronized方法和方法块 synchronized(this)和synchronized(object)的理解
- 从头认识多线程-2.13 synchronized ()代码块不单可以用this,也可以用其他对象
- 2.2.6对象锁synchronized(this)锁定的是当前对象
- 多线程之synchronized(this)锁定当前对象
- 多线程 synchronized(this)与 synchronized(非this)同步代码块的区别
- 从头认识多线程-2.25 synchronized同步方法在jvm是怎样执行的?
- synchronized方法和同步块的作用范围;synchronized(this)和synchronized(obj)的区别
- 线程-synchronized方法和同步块的作用范围;synchronized(this)和synchronized(obj)的区别
- 线程-synchronized方法和同步块的作用范围;synchronized(this)和synchronized(obj)的区别
- synchronized方法和代码块的使用
- synchronized方法和代码块的理解
- synchronized方法和synchronized块的区别
- synchronized块和synchronized方法的区别
- synchronized关键字锁住的是对象还是代码块
- PCH
- 1016 Problem P
- leetcode 90. Subsets II
- boost.asio系列——io_service
- Weex详解:灵活的移动端高性能动态化方案
- 从头认识多线程-2.12 synchronized标记的方法和synchronized(this)标记的代码块锁定的是当前对象
- User-Interface第一part的复习总结
- jq记录
- 面试常遇到的通配符匹配的两个小问题总结
- ZJNU - 1433 [a,b]区间素数的个数
- 观察者模式
- vi 命令总结
- 学习篇---自定义SiderBar
- [BZOJ1088] 扫雷游戏mine