美文网首页
synchronized

synchronized

作者: 没风的地方 | 来源:发表于2018-01-17 15:27 被阅读6次

    synchronized关键字是用来控制线程同步的,在多线程的环境下控制synchronized括号中的对象在同一时刻只能被一个线程使用。

    在应用层,可以把任何一个非null对象作为锁。synchronized作用在方法上时,锁的是当前实例对象的成员方法,叫成员锁;作用在静态方时锁住的是当前Class实例,相当于该类的一个全局锁;作用于某个代码块时,锁住的是对应的代码块,也叫成员锁,详细了解对象可以参考此文章

    Object类里面有多个被synchronized修饰的方法,如果一个对象的线程锁被线程获取,那么对于本对象里面的所有被synchronized修饰的方法其他线程都不能访问。如果Object类实例化多个对象,一个线程获取其中一个,只能控制自己获取的对象锁所对应的方法不被其他线程使用。但其他线程可以通过其他对象访问被synchronized修饰的方法。

    例如 

    一、

    public class Object{

        public synchronized void test(){ }

         public synchronized void what(){}

    }

      1 Object a=new Object();                                                                                                                                                            2 Object b=new Object();                                                                                                                                                            3 Object c=new Object();

    如果线程1 使用了a对象调用了test方法,那线程2不能再通过a调用test方法和what方法,但可以通过b调用test方法和what。此时作用于类的方法上,因此是成员锁

    二、

    public Object synMethod(Object a){

        synchronized(a){

              //此处的代码一次只能一个线程执行

    }

    }

    对于第二点,括号里面的参数可以是任何对象(因为它只是方法的一个参数,因此这里是成员锁),可以new一个byte对象,占用内存更小,参数的目的是能有一个锁让线程获取,仅此而已

    三、

    synchronized(this),这样的锁(对象锁)被一个线程获取,那别的线程在该类的所有对象上的任何操作都不可行。这是一种很粗糙的方法。

    四、

    synchronized(Object.class),这样的锁(对象锁)被一个线程获取,那别的线程在该类的所有对象上的任何操作都不可行,包括静态方法和静态变量。对于含有静态方法和静态变量的代码块的同步,通常使用这种方法来加锁。

    可以参考百度百科synchronized

    相关文章

      网友评论

          本文标题:synchronized

          本文链接:https://www.haomeiwen.com/subject/xcruoxtx.html