Java

多线程:synchronized 关键字用法(修饰类,方法,静态

2019-03-05  本文已影响31人  萨达哈鲁酱

synchronized用法

synchronized修饰的对象有几种:


修饰一个类

其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象,如下代码:

class ClassName {
   public void method() {
      synchronized(ClassName.class) {
         // todo
      }
   }
}

修饰一个方法

synchronized 修饰一个方法很简单,就是在方法的前面加synchronized,例如:

public synchronized void method()
{
   // todo
}

另外,有几点需要注意:


修饰静态方法

我们知道 静态方法是属于类的而不属于对象的 。同样的, synchronized修饰的静态方法锁定的是这个类的所有对象 。如下:

public synchronized static void method() {
   // todo
}

修饰代码块


ps

修饰静态方法其实是类锁,区别于对象锁。

public ClassA {
    public synchronized static void staticMethod() {
    // todo
}

public synchronized void method() {
    // todo
}

public void method2() {
synchronized(ClassA.class) {
            // todo
        }
    }
}

ClassA obj = new ClassA();

也就是说ClassA.staticMethod() 和 obj.method() 并不会存在互斥关系,但是会和obj.method2()存在互斥关系。


pps

在平时多线程的使用中,特别是关于自己定义一些东西的遍历和添加的时候,最好保证在遍历的时候不要添加,在输出数据的同时不要添加数据,因为多线程机智,你无法控制输出输入在同一个线程的话,最好使用锁机制,来避免一些错误的产生。

上一篇下一篇

猜你喜欢

热点阅读