我的对java中对象锁与类锁的一些理解与实例

一  什么是对象锁java

对象锁也叫方法锁,是针对一个对象实例的,它只在该对象的某个内存位置声明一个标识该对象是否拥有锁,全部它只会锁住当前的对象,而并不会对其余对象实例的锁产生任何影响,不一样对象访问同一个被synchronized修饰的方法的时候不会阻塞,异步

例如:ide

public class MyObject {
	private synchronized void method1(){
		try {
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	//synchronized修饰为同步方法,若是先调用method1,则4秒后才会调用method2
	//若是不用synchronized修饰,则能够直接异步调用,没有影响
	private void method2(){
		System.out.println(Thread.currentThread().getName());
	}
}

  建立一个类,synchronized修饰普通方法,即为对象锁,那么这个时候,多个线程访问同一个对象实例的这个方法时,是会同步的,而且只有一个线程执行完,另外一个线程才会执行:this

public static void main(String[] args) {
		//建立一个对象
		MyObject myObject=new MyObject();

        Thread t1=new Thread (new Runnable() {
			@Override
			public void run() {
				myObject.method1();
			}
		},"t1");
		Thread t2=new Thread (new Runnable() {
			@Override
			public void run() {
				myObject.method1();
			}
		},"t2");
		t1.start();
		t2.start();
	}

  即,打印t14秒以后,t2才会打印,由于两个线程调用的是同一个对象实例的方法,即同一把锁,全部会同步执行线程

而若是是不一样对象实例的话,则没有影响,由于两个线程调用的是不一样实例的锁方法,即不是同一把锁,没有关系,因此会正常输出,不会同步对象

 

public static void main(String[] args) {
		//建立两个对象
		MyObject myObject=new MyObject();
		MyObject myObject01=new MyObject();

        Thread t1=new Thread (new Runnable() {
			@Override
			public void run() {
				myObject.method1();
			}
		},"t1");
		Thread t2=new Thread (new Runnable() {
			@Override
			public void run() {
				myObject01.method1();
			}
		},"t2");
		t1.start();
		t2.start();
	}

二 对象锁的几种形式以及应用案例blog

1 synchronized修饰普通方法属于对象锁,内存

2,资源

synchronized修饰的代码块传入this也属于对象锁get

应用:减少锁粒度,第二种形式就比较好,好比A线程调用一个同步方法须要很长时间,那么B就要等待很长时间,这个时候能够将必须同步的代码使用synchronized代码块,

 

 不不须要同步的先执行,节约资源

 三 类锁

类锁是锁住整个类,当有多个线程来声明这个类的对象时候将会被阻塞,直到拥有这个类锁的对象呗销毁或者主动释放了类锁,这个时候在被阻塞的线程被挑选出一个占有该类锁,声明该类的对象。其余线程继续被阻塞住

(上面百度的),即一句话,无论多少个对象,多少个对象,共用一把多,且只有一把,无论怎么调用,都会同步

上面方法加static变类锁:

private static synchronized void method1(){
		try {
			System.out.println(Thread.currentThread().getName());
			Thread.sleep(4000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

  这个时候不管线程调用的是多少个对象实例的方法,都会同步

四 类锁形式

1 synchronized修饰静态方法属于类锁

2

相关文章
相关标签/搜索