zoukankan      html  css  js  c++  java
  • Thread中的synchronized

    类的每个实例都有自己的对象级别锁,例如当创建了一个类的两个不同对象(obj1->thread1,obj2-)thread2)时,尽管调用的时synchronized的方法,但不存在排斥访问对象级别锁。当thread1进入该方法是获得排斥性访问obj1的对象级别锁的权限,同理,thread2进入该方法是获得反问obj2的对象级别锁的权限!

    不明白的是:

    public synchronized String getNames() {
            return lname + ", " + fname;
        }

        public synchronized void setNames(
                    String firstName,
                    String lastName
                ) {

    当Threa1在执行方法setNamee(..)时,Thread2为什么受到阻塞阿?

    如果两个或者多个线程同时与某个对象的成员变量交互,而且至少有一个线程会更改他的直,则一般来说,理想的做法是使用synchronized来控制并发访问。如果只有一个线程访问对象,那就没有必要了使用synchronized,这样反而减缓了他的执行速度!

    当整个方法不需要同步,或者希望thread获得不同对象上的对象级别锁时可以使用(synchronized block)

      sychronized (obj){

    ....}

    obi 是对性的引用],必须进入代码段之前获得对象的级别锁!

    for example

    public synchronized void setPoint(int x,int y){

      this.x =x;

    this.y =y;

    }

    使用同步块:

    public  void setPoint(int x,int y){

        synchronized(this){

    this.x =x;

    this.y =y;

    }

    //广州达内www.gztarena.com
    两个版本几乎相同,但是都确保在修改,xy之前获得实例的对象级别锁的排斥访问权限!

    synchronized语句还可以使用类的级别锁,可以确保一个thread对两个static的方法调用不会与另一个thread的调用交织在一起!
    synchronized (className.class){
    //....}
     实际使用时将类的名字替换其中的className.

  • 相关阅读:
    关于sizeof表达式作为数组元素个数的编译
    【deque】滑动窗口、双端队列解决数组问题
    【二叉树】重建二叉树
    字符数组与字符串指针
    【STL】C中的qsort与C++中的sort
    对C++不是类型安全语言的理解
    【vector】创建一个二维vector当作二维数组用
    批量处理改变文件名、文件后缀名
    位运算
    关于sqlserver帐号被禁用问题
  • 原文地址:https://www.cnblogs.com/javaitpx/p/2761981.html
Copyright © 2011-2022 走看看