互斥操作应该写在资源里,这样无论是任何线程访问这个资源,都不会产生问题,也不用每个线程都重写互斥代码
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(); } }