synchronized 修饰不同方法有何区别?
java 中,synchronized 修饰不同方法有何区别?
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方法式.