synchronized修饰方法的区别?

Java 中,synchronized 修饰不同方法有何区别?

当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁;当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。在HotSpot JVM实现中,锁有个专门的名字:对象监视器。
synchronized {修饰代码块}
synchronized {static方法}
synchronized {run方法}
synchronized {普通方法}
有什么区别?

1.synchronized的意义
synchronized用于多线程设计,有了synchronized关键字,多线程程序的运行结果将变得可以控制。synchronized关键字用于保护共享数据。
2.synchronized实现同步的机制
synchronized依靠"锁"机制进行多线程同步,"锁"有2种,一种是对象锁,一种是类锁。
3.此下面2种是依靠对象锁锁定,初始化一个对象时,自动有一个对象锁。synchronized {普通方法}依靠对象锁工作,多线程访问ynchronized方法,一旦某个进程抢得锁之后,其他的进程只有排队对待。
synchronized void method{}功能上,等效于
void method{
   synchronized(this)
   }
}

synchronized {修饰代码块}的作用不仅于此,synchronized void method{}整个函数加上synchronized块,效率并不好。在函数内部,可能我们需要同步的只是小部分共享数据,其他数据,可以自由访问,这时候我们可以用 synchronized(表达式){//语句}更加精确的控制。
4.synchronized {static方法}此代码块等效于
void method{
   synchronized(Obl.class)
   }
}
使用该类的类对象的锁定去做线程的共享互斥.

5.synchronized {run方法}run方法的锁定.
这个举例比较好说。
public class MyThread implement Runnable{
     public void run(){
   for(int i=0;i<10;i++){
     System.out.println(i+" ");
   }
}
}
如果在主程序多线程运行
MyThread t=new MyThread ();
  new Thread(t).start();
  new Thread(t).start();
  new Thread(t).start();
  new Thread(t).start();
其结果是混乱不堪的。
如果加了synchronized当前线程取完所有数据后,才会释放锁,所以结果可以预知。4个线程输出总是0,1...9

synchronized {普通方法}同一时刻职能有一个对象访问该方法,其他的 我就不知道了

synchronized {修饰代码块} ——当用synchronized修饰某个方法A时,可以防止多个线程同时访问这个对象的方法A
synchronized {static方法}——同一时间只能被一个方法引用
synchronized {run方法} ——只能生成一个runnable对象,在内存中运行
synchronized {普通方法} ——同一时刻只能有一个对象访问该方法

synchronize:只修饰方法和代码块;当用synchronized修饰某个方法A时,可以防止多个线程同时访问这个对象的方法A;如一个对象有多个synchronized方法,只要一个线程方问了其中一个,其它线程就不能同时方问这个对象的任一一个synchronized方法;但一个类可有多个对象,其它线程可以访问别一对象的synronized方法. 当用synchronized修饰代码块时,表时这个区块也是互斥访问,不能有多个线程同时访问.

synchronized关键字不能继承,也就是说在基类中方法:synchronized void f(){};在其继承类中就变成了void f(){};在继承类中要显式指定它的某个方法为synchronized方法式.

原文地址:https://blog.csdn.net/hi_jess/article/details/4840401

发布了19 篇原创文章 · 获赞 15 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/minion_banana/article/details/82468547