synchronized的用法

转载 2013年12月03日 13:21:47

. 1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入.
public synchronized void synMethod() {
        
//方法体
      }

如果一个对象有多个synchronized方法,某一时刻某个线程已经进入到了某个synchronized方法,那么在该方法没有执行完毕前,其他线程是无法访问该对象的任何synchronized方法的。

Java中的每个对象都有一个锁(lock),或者叫做监视器(monitor),当一个线程访问某个对象的synchronized方法时,将该对象上锁其他任何线程都无法再去访问该对象的synchronized方法了(这里是指所有的同步方法,而不仅仅是同一个方法),直到之前的那个线程执行方法完毕后(或者是抛出了异常),才将该对象的锁释放掉,其他线程才有可能再去访问该对象的synchronized方法。

当一个synchronized关键字修饰的方法同时又被static修饰,之前说过,非静态的同步方法会将对象上锁,但是静态方法不属于对象,而是属于类,它会将这个方法所在的类的Class对象上锁

所以如果是静态方法的情况(execute()和execute2()都加上static关键字),即便是向两个线程传入不同的Example对象,这两个线程仍然是互相制约的,必须先执行完一个,再执行下一个。

 

  结论:

  如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的类所对应的Class对象。Java中,无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,它们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始。

 

2.对某一代码块使用,synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块.此时,线程获得的是成员锁.例如:
      public int synMethod(int a1){
        synchronized(a1) 
{
          
//一次只能有一个线程进入
        }

      }

 可能一个方法中只有几行代码会涉及到线程同步问题,所以synchronized块比synchronized方法更加细粒度地控制了多个线程的访问,只有synchronized块中的内容不能同时被多个线程所访问,方法中的其他语句仍然可以同时被多个线程所访问(包括synchronized块之前的和之后的)。

  注意:被synchronized保护的数据应该是私有的

  结论:

  synchronized方法是一种粗粒度的并发控制,某一时刻,只能有一个线程执行该synchronized方法;

  synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于方法内、synchronized块之外的其他代码是可以被多个线程同时访问到的。

 

synchronized关键字的用法详解

  • 2011年03月17日 10:15
  • 54KB
  • 下载

java中synchronized的用法详解

Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。      一、当两个并发线程访问同一个对象object中的这个synchroni...

java基础-5-多线程(2)-死锁与线程间通信(synchronized与Lock的区别及各自用法)

------- android培训、java培训、期待与您交流! ---------- 死锁         死锁是指多个应用程序进程间,因为对资源的竞争而造成的一种僵局(即互相等待...

Java 多线程5:synchronized 关键字用法(修饰类,方法,静态方法,代码块)

在 多线程生成的原因(Java内存模型与i++操作解析) 中,介绍了Java的内存模型,从而可能导致的多线程问题。synchronized就是避免这个问题的解决方法之一。除了 synchronized...

多线程问题汇总<synchronized关键字的用法>

*synchronize 锁的概念 java的内置锁:      每个java对象都可以用作一个实现同步的锁,这些锁称为内部锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法...

java中synchronized的用法详解

记下来,很重要。 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。      一、当两个并发线程访问同一个对象object中...

Java中Synchronized的用法 (写的非常好,非常清晰)

原文:http://blog.csdn.net/luoweifu/article/details/46613015 作者:luoweifu 转载请标名出处 《编程思想之多线程与多进程(...

史上最全synchronized用法详解

Java中synchronized关键字用于代码的同步执行,他可以修饰代码块、方法、this、Object.class,能够保证在多线程环境中只有线程执行。synchronized作用范围越小并发能力...

java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁

首先说明一下:方法锁和对象锁说的是一个东西,即只有方法锁或对象锁 和类锁两种锁 作者用通俗易懂的语言将复杂的技术讲解的如此透彻,学习,传播! 原文地址:http://zhh91...

java中synchronized的用法详解

记下来,很重要。 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。      一、当两个并发线程访问同一个对象object中...
  • yztezhl
  • yztezhl
  • 2014年04月10日 17:09
  • 340
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:synchronized的用法
举报原因:
原因补充:

(最多只允许输入30个字)