从头认识多线程-2.12 synchronized ()代码块不单可以用this,也可以用其他对象

这一章节我们来讨论一下synchronized ()代码块的另一个用法,它不单可以用this,也可以用其他对象。

1.代码清单

package com.ray.deepintothread.ch02.topic_13;

/**
 *
 * @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;
	}

	@Override
	public void run() {
		try {
			myService.updateA();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class ThreadTwo implements Runnable {

	private MyService myService;

	public ThreadTwo(MyService myService) {
		this.myService = myService;
	}

	@Override
	public void run() {
		try {
			myService.updateB();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class MyService {

	private Object object;

	public MyService() {
		object = new Object();
	}

	public void updateA() throws InterruptedException {
		synchronized (object) {
			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 (object) {
			long startTime = System.currentTimeMillis();
			System.out.println("updateB startTime:" + startTime);
			Thread.sleep(1000);
			long endTime = System.currentTimeMillis();
			System.out.println("updateB endTime:" + endTime);
		}
	}

}

输出:

updateA startTime:1462455786957
updateA endTime:1462455787958
updateB startTime:1462455787958
updateB endTime:1462455788958

2.结论

从输出可以看见,跟前面章节的代码相比,我们把synchronized ()里面的this换成一个new Object(),而且这个object不一定是object,可以是任何对象

总结:这一章节展示了synchronized ()代码块的另一个用法,它不单可以用this,也可以用其他对象。

这一章节就到这里,谢谢

------------------------------------------------------------------------------------

我的github:https://github.com/raylee2015/DeepIntoThread

目录:http://blog.csdn.net/raylee2007/article/details/51204573

这一章节就到这里,谢谢

------------------------------------------------------------------------------------

我的github:https://github.com/raylee2015/DeepIntoThread

目录:http://blog.csdn.net/raylee2007/article/details/51204573

时间: 2024-08-08 09:00:39

从头认识多线程-2.12 synchronized ()代码块不单可以用this,也可以用其他对象的相关文章

从头认识多线程-2.9 同步代码块的特殊现象:一半同步,一半异步

这一章节我们来讨论一下同步代码块的一个特殊现象:一半同步,一半异步 1.代码清单: 1)目的:展示同步代码块的同步与异步并存的现象 2)代码功能说明: (1)建立一个测试类 (2)创建三个属性域 (3)创建三个方法,一个同步,两个不同步 (4)方法的内容是输出整数相加的结果以及相应的线程名称 (5)使用两个线程同时访问 package com.ray.deepintothread.ch02.topic_10; /** * * @author RayLee * */ public class Sy

多线程:synchronized代码块、synchronized方法、静态synchronized方法使用的锁

在学习多线程的过程中,很多资料都会指出synchronized代码块和synchronized方法使用的锁都是this ,静态synchronized方法使用的锁是类锁,那么从这个结论出发,如何进行逆向证明呢? 证明this锁 `` public class ThreadDemo3 {    public static void main(String[] args) throws InterruptedException{        MyThread3 mt = new MyThread3

[java多线程] - 锁机制&同步代码块&信号量

在美眉图片下载demo中,我们可以看到多个线程在公用一些变量,这个时候难免会发生冲突.冲突并不可怕,可怕的是当多线程的情况下,你没法控制冲突.按照我的理解在java中实现同步的方式分为三种,分别是:同步代码块机制,锁机制,信号量机制. 一.同步代码块 在java的多线程并发开发过程中,我们最常用的方式就是使用同步代码关键字(synchronized).这种方式的使用不是特别复杂,需要注意的只是你需要明确到底同步的是那个对象,只有当同步的对象一致的情况下,才能够控制互斥的操作.一般情况下,我们会同

从头认识多线程-2.2 synchronized持有对象锁与类锁的相同点

这一章节我们来讨论一下synchronized持有对象锁与类锁的相同点. 1.当所有方法都不使用同步的时候 代码清单 package com.ray.deepintothread.ch02.topic_2; public class SynchInstance1 { public static void main(String[] args) throws InterruptedException { MyTestObjectOne myTestObjectOne = new MyTestObj

从头认识多线程-3.3 synchronized某些解决不了的可视性问题,只能使用volatile来解决

这一章节我们讨论一下synchronized某些解决不了的可视性问题. 1.引入之前的异步死循环代码: package com.ray.deepintothread.ch03.topic_3; public class DeadForAsychn { public static void main(String[] args) throws InterruptedException { MyClassOne myClassOne = new MyClassOne(); myClassOne.st

从头认识多线程-2.3 synchronized持有对象锁与类锁的不同点

这一章节我们来讨论游戏,synchronized持有对象锁与类锁的不同点-两种锁是并行的东西,没有交集. 1.同步持有对象锁或者类锁 package com.ray.deepintothread.ch02.topic_3; public class SynchInstance5 { public static void main(String[] args) throws InterruptedException { MyTestObjectFive myTestObjectFive = new

从头认识多线程-1.12 suspend和resume缺点-不同步

这一章节我们继续来讨论suspend和resume的另一个缺点-不同步. 1.代码清单 package com.ray.deepintothread.ch01.topic_12; public class SuspendUnSynch { public static void main(String[] args) throws InterruptedException { MyObject myObject = new MyObject(); ThreadOne threadOne = new

java 多线程9 : synchronized锁机制 之 代码块锁

synchronized同步代码块 用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间.这种情况下可以尝试使用synchronized同步语句块来解决问题.看一下例子: 下面例子是优化后的例子 使用代码块锁,原先例子是方法锁,就是同步 必须要执行2个for  public class ThreadDomain18 { public void doLongTimeTask() throws Exception

2016/9/25编写java实验报告时对synchronized(同步代码块)的一些感悟

通过此次实验,明白了多线程的设置和启动.synchronized代码块的用法.线程的优先级使用方法.知道了那几类资源是线程共享的. 我现在理解的多线程是:实例化一个继承了Thread类或实现了Runnable接口的类(继承是为了使其拥有参与多线程的资格):然后再将该类run()中的代码交由Thread类来执行,以此实现多线程的同步运行 经过翻阅网络博客,和代码尝试,进一步的认识了同步代码块: ①synchronized(){}代码块在执行时先判断括号里的对象有没有被上锁: 若无,则上锁并开始执行