java对象锁

在进行多线程开发时,经常会用到同步锁:synchronized。该关键字可以使用在普通方法上,也可以使用在static方法上。这里叙述下这两种方式的区别,避免以后忘记。

我们都知道,每一个对象都有一个监视器。对于每一个类,有一个Class对象,也可以有该类的实例对象。如果synchronized放在普通方法上,线程在同步访问时,就会查看该类实例对象上的监视器;如果synchronized放在static方法上,则会查看Class对象上的监视器。因为是两个不同的对象,所以这两种方式不会互相干扰,线程可以并发访问。

看下面这个例子:

public class TestSynchronizedA {

	public synchronized static void m1() {
		System.out.println("m1");
	}

	public synchronized void m2() {
		System.out.println("m2");
	}

	public static void main(String[] args) {
		final TestSynchronizedA A = new TestSynchronizedA();

		Executor exec = Executors.newCachedThreadPool();
		exec.execute(new Runnable() {
			@Override
			public void run() {
				A.m2();
			}
		});
		exec.execute(new Runnable() {
			@Override
			public void run() {
				TestSynchronizedA.m1();
				A.m1();
			}
		});
	}
}

m1是static方法,m2是普通方法。synchronized关键字加在这俩方法上,因此,在线程并发访问时,对于m1,使用的是Class对象的监视器,对于m2,使用的是普通对象的监视器(如例子中的对象A)。

例子中的两个线程在执行时,可以同时并发访问m1和m2。在使用普通对象A调用static方法m1时,也是可以并发访问的。

因此,总结如下:

1、对于静态方法,其使用的是Class上的监视器,无论使用何种调用方式(类名调用静态方法或实例调用静态方法)。

2、对于普通方法,其使用的是实例上的监视器。

3、对于静态方法和普通方法,线程对他们之间的访问没有任何限制。但如果访问同类型的方法(如,同时访问多个静态方法或同时访问多个普通方法),会有同步锁的限制(前提:访问的是同一个对象)。

时间: 2024-12-11 03:45:32

java对象锁的相关文章

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

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

java对象锁和类锁

参考 http://www.cnblogs.com/yyyyy5101/archive/2011/07/20/2112157.html http://www.cnblogs.com/kkcheng/archive/2011/02/25/1964521.html http://my.oschina.net/billowworld/blog/120766 1.java对象锁 所有对象都自动含有单一的锁.JVM负责跟踪对象被加锁的次数.如果一个对象被解锁,其计数变为0.在任务(线程)第一次给对象加锁的

java 对象锁学习

机制 锁机制是用来解决多线程共享资源时产生的冲突问题的.java 为每一个对象关联一个对象锁,通常把锁分为对象锁和类锁,他们的本质都是对象锁,只不过对象锁关联的是类的 Object 对象 (java.lang.Object),而类锁关联的是类的 Class 对象 java.lang.Class. jvm 对每个锁都有一个计数 若该计数为 0,则锁没有被占用,可以被访问它的线程来持有 一个对象的对象锁已被某个线程持有,新的线程来访问时将被挂起,知道持有它的线程释放该锁并且计数为 0 一个线程已经持

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

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

java对象锁&amp;类锁

首先,来看一段代码. 1 public class PersonSet { 2 3 private final Set<Person> mySet = new HashSet<Person>(); 4 5 public synchronized void add(Person p){ 6 mySet.add(p); 7 } 8 9 public synchronized boolean contains(Person p){ 10 return mySet.contains(p);

Java 对象锁-synchronized()与线程的状态与生命周期

synchronized(someObject){ //对象锁 } 对象锁的使用说明: 1.对象锁的返还. 当synchronize()语句执行完成. 当synchronize()语句执行出现异常. 当线程调用了wait()方法. 2.使用对象锁保护的数据都必须是私有的. 3.对象锁具有可重入性. 一个线程在已经获得对象锁的情况下,可以再次请求获得对象锁. 4.线程的生命周期

Java多线程 同步 对象锁

多线程.同步: https://www.cnblogs.com/GarfieldEr007/p/5746362.html Java对象锁和类锁全面解析(多线程synchronized关键字): http://blog.csdn.net/u013142781/article/details/51697672 Java Object对象中的wait,notify,notifyAll通俗理解 http://blog.csdn.net/vk5176891/article/details/53945677

(转)java并发对象锁、类锁、私有锁

转自:http://ifeve.com/java-locks/ 建议参考:http://www.zhihu.com/question/28113814 Java类锁和对象锁实践 感谢[jiehao]同学的投稿,投稿可将文章发送到[email protected] 类锁和对象锁是否会冲突?对象锁和私有锁是否会冲突?通过实例来进行说明. 一.相关约定 为了明确后文的描述,先对本文涉及到的锁的相关定义作如下约定: 1. 类锁:在代码中的方法上加了static和synchronized的锁,或者sync

java的对象锁和对象传递

1.对象传递 在JAVA的参数传递中,有两种类型,第一种是基本类型传递,例如int,float,double等,这种是值传递,另外一种是对象传递,比如String或者自定义的类,这种是引用传递. 也就是说,基本类型传递的是一个副本,而对象传递的是对象本身. 2.锁 JAVA中,对象锁的概念,就是对对象进行加锁,每个对象都会有一个内存锁,如果加上锁以后,就只能让一个线程进行操作,在操作完成之前,其他线程无法对该对象进行再次操作. 3.例子 package com.itbuluoge.mythrea