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方法式.

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值