从头认识多线程-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 MyTestObjectFive();
		for (int i = 0; i < 2; i++) {
			ThreadFive threadFive = new ThreadFive(myTestObjectFive);
			Thread thread = new Thread(threadFive);
			thread.setName("" + i);
			thread.start();
		}
	}
}

class ThreadFive implements Runnable {

	private MyTestObjectFive myTestObjectFive;

	public ThreadFive(MyTestObjectFive myTestObjectFive) {
		this.myTestObjectFive = myTestObjectFive;
	}

	@Override
	public void run() {
		try {
			if (Integer.parseInt(Thread.currentThread().getName()) % 2 == 0) {
				myTestObjectFive.test1();
			} else {
				myTestObjectFive.test2();
			}

		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class MyTestObjectFive {
	public synchronized void test1() throws InterruptedException {
		for (int i = 0; i < 5; i++) {
			System.out.println(i);
			Thread.sleep(100);
		}
	}

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

输出:

0
1
2
3
4
0
1
2
3
4

package com.ray.deepintothread.ch02.topic_3;

public class SynchInstance6 {
	public static void main(String[] args) throws InterruptedException {
		for (int i = 0; i < 2; i++) {
			ThreadSix threadSix = new ThreadSix();
			Thread thread = new Thread(threadSix);
			thread.setName("" + i);
			thread.start();
		}
	}
}

class ThreadSix implements Runnable {

	@Override
	public void run() {
		try {
			if (Integer.parseInt(Thread.currentThread().getName()) % 2 == 0) {
				MyTestObjectSix.test1();
			} else {
				MyTestObjectSix.test2();
			}

		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class MyTestObjectSix {
	public static synchronized void test1() throws InterruptedException {
		for (int i = 0; i < 5; i++) {
			System.out.println(i);
			Thread.sleep(100);
		}
	}

	public static synchronized void test2() throws InterruptedException {
		for (int i = 0; i < 5; i++) {
			System.out.println(i);
			Thread.sleep(100);
		}
	}
}

输出:

0
1
2
3
4
0
1
2
3
4

像前面章节一样,当我们同步持有对象锁或者类锁,输出的是按照顺序的

2.当同时持有对象锁和类锁

package com.ray.deepintothread.ch02.topic_3;

public class SynchInstance4 {
	public static void main(String[] args) throws InterruptedException {
		MyTestObjectFour myTestObjectThree = new MyTestObjectFour();
		for (int i = 0; i < 2; i++) {
			ThreadFour threadFour = new ThreadFour(myTestObjectThree);
			Thread thread = new Thread(threadFour);
			thread.setName("" + i);
			thread.start();
		}
	}
}

class ThreadFour implements Runnable {

	private MyTestObjectFour myTestObjectThree;

	public ThreadFour(MyTestObjectFour myTestObjectThree) {
		this.myTestObjectThree = myTestObjectThree;
	}

	@Override
	public void run() {
		try {
			if (Integer.parseInt(Thread.currentThread().getName()) % 2 == 0) {
				myTestObjectThree.test1();
			} else {
				MyTestObjectFour.test2();
			}

		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

class MyTestObjectFour {
	public synchronized void test1() throws InterruptedException {
		for (int i = 0; i < 5; i++) {
			System.out.println(i);
			Thread.sleep(100);
		}
	}

	public static synchronized void test2() throws InterruptedException {
		for (int i = 0; i < 5; i++) {
			System.out.println(i);
			Thread.sleep(100);
		}
	}
}

输出:

0
0
1
1
2
2
3
3
4
4

从输出可以看见,两者就像平行的关系,没有交集,交替的出现。但也是有秩序的。

总结:这一章节讨论了synchronized持有对象锁与类锁的不同点

这一章节就到这里,谢谢

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

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

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

时间: 2024-11-08 17:29:04

从头认识多线程-2.3 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

Java对象锁和类锁全面解析(多线程synchronized关键字)

最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没用对都不知道. 今天把一些疑惑都解开了,写篇文章分享给大家,文章还算比较全面.当然可能有小宝鸽理解得不够深入透彻的地方,如果说得不正确还望指出. 看之前有必要跟某些猿友说一下,如果看一遍没有看明白呢,也没关系,当是了解一下,等真正使用到了,再回头看. 本文主要是将synchronized关键字用法作

Java学习(十一):Java锁Synchronized,对象锁和类锁举例

Java的锁分为对象锁和类锁. 1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内针对该对象的操作只能有一个线程得到执行.另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块. 2. 然而,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块. 3. 尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对该object中所有其它sync

synchronized关键字以及对象锁和类锁的区别

java并发编程中最长用到的关键字就是synchronized了,这里讲解一下这个关键字的用法和容易混淆的地方.synchronized关键字涉及到锁的概念, 在java中,synchronized锁大家又通俗的称为:方法锁,对象锁 和 类锁 三种. 先上结论! 1 无论是修饰方法还是修饰代码块都是 对象锁,当一个线程访问一个带synchronized方法时,由于对象锁的存在,所有加synchronized的方法都不能被访问(前提是在多个线程调用的是同一个对象实例中的方法)2 无论是修饰静态方法

001JAVA多线程实例对象锁与类锁

package com.skcc.mthread; public class MuiltThread { private static int num = 0; public MuiltThread() { // TODO Auto-generated constructor stub } /**** * synchronized void printNum(String tag) 代表 synchronized锁定的MuiltThread实例对象锁(m1,m2两者间互不影响) * static

【Thread】java线程之对象锁、类锁、线程安全

说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来了. 一.基本说明 类.对象:...(不知道怎么说,只可意会不可言传>.<!):要明白哪些方法.变量是对象的,哪些是类的. 类锁.对象锁:对应类和对象.每个类有且仅有一个类锁,每个对象有且仅有一个对象锁. ex: Person p1 = new Person(); Person p2 = new

java 对象锁和类锁的区别(转)

java 对象锁和类锁的区别   转自 <http://zhh9106.iteye.com/blog/2151791> 在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途

synchronize——对象锁和类锁

最近在研究Java 多线程的只是,经常能看到synchronize关键字,以前只是一眼带过,没有细究,今天趁这个机会,整理下 synchronize作为多线程关键字,是一种同步锁,它可以修饰以下几种对象: 代码块:被修饰的代码块称为同步语句块,其作用的范围是大括号{ }里的代码,作用的对象是调用这个代码块的对象: 方法:被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象 静态方法:作用的范围是整个静态方法,作用的对象是这个类的所有对象 类:作用的范围是synchro

zbb20180929 thread 自旋锁、阻塞锁、可重入锁、悲观锁、乐观锁、读写锁、对象锁和类锁

1.自旋锁自旋锁可以使线程在没有取得锁的时候,不被挂起,而转去执行一个空循环,(即所谓的自旋,就是自己执行空循环),若在若干个空循环后,线程如果可以获得锁,则继续执行.若线程依然不能获得锁,才会被挂起.使用自旋锁后,线程被挂起的几率相对减少,线程执行的连贯性相对加强.因此,对于那些锁竞争不是很激烈,锁占用时间很短的并发线程,具有一定的积极意义,但对于锁竞争激烈,单线程锁占用很长时间的并发程序,自旋锁在自旋等待后,往往毅然无法获得对应的锁,不仅仅白白浪费了CPU时间,最终还是免不了被挂起的操作 ,