java synchronized

来源:互联网 发布:淘宝格子铺怎么样 编辑:程序博客网 时间:2024/06/07 10:00

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

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();}}


1 0
原创粉丝点击