java synchronized

        互斥操作应该写在资源里,这样无论是任何线程访问这个资源,都不会产生问题,也不用每个线程都重写互斥代码


synchronized

* 可以用来修饰函数,也可用来修饰代码块

* 无论修饰什么,里面都包含一把锁对象,如果想要两个线程互斥,

* 必须保证他们在执行关键字囊括的代码时,得到的必须是同一把锁,

* 否则则不能达到互斥操作

*

* 修饰函数:

* 1、修饰静态函数:锁就是指代的当前对象this

* 2、修饰普通函数:锁就是指代的本类的字节码对象,即:类名.class

* 修饰代码块:

* 你可以传递任何对象作为锁对象,但是必须保证互斥线程间的锁是相同的,

* 非互斥线程之间的锁是不同的

// 互斥资源
class Resources{
	public void print(String name){
		// 锁对象为name,若是多个互斥线程传过来的name不是同一对象,则不会互斥
		synchronized (name) {
		int len = name.length();
			for(int i=0;i<len;i++){
				System.out.print(name.charAt(i));
			}
			System.out.println();
		}
	}
	
	/** Resources r1 = new Resources()
	 *  Resources r2 = new Resources()
	 *  锁对象为this,即当前对象,对于访问同一资源对象(r1)的多个线程,是互斥的,
	 *  对于访问不同资源(r1和r2等)的多个线程,是不互斥的
	 */
	public synchronized void print1(String name){
		for (int i = 0; i < name.length(); i++) {
			System.out.print(name.charAt(i));
		}
		System.out.println();
	}
	
	// 锁对象为Resources类的字节码对象,独一无二,只此一份,所有线程执行这段代码,都会互斥
	// 只要有线程访问它,都会互斥
	public synchronized static void print3(String name){
		for (int i = 0; i < name.length(); i++) {
			System.out.print(name.charAt(i));
		}
		System.out.println();
	}

}

猜你喜欢

转载自cdl-001.iteye.com/blog/2316031