从头认识多线程-2.17 同步方法与同步静态代码块持有的是不同的锁

这一章节我们来讨论一下同步方法与同步静态代码块持有的是不同的锁。

代码清单:

package com.ray.deepintothread.ch02.topic_18;

/**
 *
 * @author RayLee
 *
 */
public class SynchClass {
	public static void main(String[] args) throws InterruptedException {
		MyService myService = new MyService();
		ThreadOne threadOne = new ThreadOne();
		Thread thread = new Thread(threadOne);
		thread.start();
		ThreadTwo threadTwo = new ThreadTwo(myService);
		Thread thread2 = new Thread(threadTwo);
		thread2.start();
	}
}

class ThreadOne implements Runnable {

	@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 static int id = 0;

	public synchronized static void updateA() throws InterruptedException {
		for (int i = 0; i < 5; i++) {
			System.out.println(Thread.currentThread().getName() + " " + id++);
			Thread.sleep(50);
		}
	}

	public synchronized void updateB() throws InterruptedException {
		for (int i = 0; i < 5; i++) {
			System.out.println(Thread.currentThread().getName() + " " + id++);
			Thread.sleep(100);
		}
	}

}

输出:

Thread-0 0
Thread-1 1
Thread-0 2
Thread-1 3
Thread-0 4
Thread-0 5
Thread-0 6
Thread-1 7
Thread-1 8
Thread-1 9

从输出可以看见,两个线程的输出是不同步的,从而证明两个方法持有的是不同的锁。

总结:这一章节主要展示了同步方法与同步静态代码块持有的是不同的锁。

这一章节就到这里,谢谢

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

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

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

时间: 2024-11-05 17:22:31

从头认识多线程-2.17 同步方法与同步静态代码块持有的是不同的锁的相关文章

从头认识多线程-2.16 同步静态方法和静态代码块

这一章节我们来讨论一些同步静态方法和静态代码块. 代码清单 package com.ray.deepintothread.ch02.topic_17; /** * * @author RayLee * */ public class SynchClass { public static void main(String[] args) throws InterruptedException { ThreadOne threadOne = new ThreadOne(); Thread threa

java中的静态代码块、构造代码块、普通代码块和同步代码块总结

java中的4中代码块总结如下: * 加了static的是静态代码块,在类中写了一对{}是构造代码块,在方法中写了一对{}是普通代码块, * java中还有一种代码块是同步代码块,常用在多线程中, synchronized关键字, * 同步代码块格式是:synchronized(同步对象){} * 静态代码块 先于构造代码块 先于构造方法执行 * 静态代码块 先于普通代码块 先于构造方法执行 * 构造代码块和普通代码块按照程序逻辑顺序执行 package 面试题; class HelloA{ p

从头认识多线程-2.7 同步方法的隐患

这一章节我们来讨论一下同步方法的隐患. 1.同步虽然给我们带来数据的一致性,但是,同时也降低了性能,代码清单: package com.ray.deepintothread.ch02.topic_8; import java.sql.Time; /** * <br> * <br> * * @author RayLee * */ public class ThreatOfSynch { public static void main(String[] args) throws Int

从头认识多线程-2.14 解决由同步的synchronized (newobject()) 引起的脏读的方法

这一章节我们来讨论一下解决由同步的synchronized (newobject()) 引起的脏读的方法. 1.造成上面脏读的原因:多线程多方法同时访问并修改某个属性域 2.解决思路 顺着上面的原因,笔者提出两种不是方法的方法 (1)只能单线程单方法访问并修改某个属性域这样就保证了执行的顺序(也就是需要同步所有访问并修改的步骤)(缺点:性能低下,优点:数据的强一致性) (2)在多线程多方法的情况下,只能够访问多个属性域,不能够同时访问并修改某一个单一的属性域(根本目的就是分开运算,但是,在生产环

从头认识多线程-1.17 守护线程setDaemon()

这一章节我们来讨论一下守护线程. 1.特性 守护线程是需要等待其他用户线程结束后才结束的线程,俗称保姆线程 2.源码解析 /** * Marks this thread as either a {@linkplain #isDaemon daemon} thread * or a user thread. The Java Virtual Machine exits when the only * threads running are all daemon threads. * * <p>

java多线程(五)synchronized关键字修饰代码块

转载请注明出处:http://blog.csdn.net/xingjiarong/article/details/47916703 在上一篇博客中我们介绍了synchronized关键字修饰方法的用法,我们接着介绍synchronized关键字.除了修饰方法之外,还可以修饰代码块,一共有以下5种用法. 一.this synchronized(this){ //互斥代码 } 这里的this指的是执行这段代码的对象,synchronized得到的锁就是this这个对象的锁,这种写法等价于我们上一篇博

深入理解Java中的同步静态方法和synchronized(class)代码块的类锁

一.回顾学习内容 在前面几篇博客中我我们已经理解了synchronized对象锁.对象锁的重入.synchronized方法块.synchronized非本对象的代码块, 链接:https://www.cnblogs.com/SAM-CJM/category/1314992.html 我们来总结一下,上面几篇讲到内容: 1.创建线程类的两个方式:继承Thread类和实现Runable接口. 2.了解了Thread类的几个基本构造器. 3.启动多线程时要使用start方法,不要直接调用run方法.

从头认识多线程-2.8 缓解同步方法的隐患-同步代码块

这一章节我们来讨论一下缓解同步方法的隐患-同步代码块. 1.思路:把同步方法,降低同步的粒度,同步到代码块 2.根据上一章节的例子,我们把代码修改一下 (1)第一种方法,把同步标记移到更新的那一栏里面去,一般来说大部分都是更新的时候需要同步数据 package com.ray.deepintothread.ch02.topic_9; /** * 从头认识多线程-2.8 缓解同步方法的隐患-同步代码块<br> * * @author RayLee * */ public class Relief

多线程下的进程同步(线程同步问题总结篇)

之前写过两篇关于线程同步问题的文章(一,二),这篇中将对相关话题进行总结,本文中也对.NET 4.0中新增的一些同步机制进行了介绍. 首先需要说明的是为什么需要线程功能同步.MSDN中有这样一段话很好的解释了这个问题: 当多个线程可以调用单个对象的属性和方法时,对这些调用进行同步处理是非常重要的.否则,一个线程可能会中断另一个线程正在执行的任务,使该对象处于一种无效状态. 也就说在默认无同步的情况下,任何线程都可以随时访问任何方法或字段,但一次只能有一个线程访问这些对象.另外,MSDN中也给出定