synchronized代码块

synchronized代码块类似于以下这种形式:
synchronized(synObject) {
        
    }
当在某个线程中执行这段代码块,该线程会获取对象synObject的锁,从而使得其他线程无法同时访问该代码块。
synObject可以是this,代表获取当前对象的锁,也可以是类中的一个属性,代表获取该属性的锁。

注意:测试的时候是同一个对象的两个线程测试,不是两个对象。

比如上面的insert方法可以改成以下两种形式:
class InsertData {
    private ArrayList<Integer> arrayList = new ArrayList<Integer>();
    
    public void insert(Thread thread){
      
  synchronized (this) {
            for(int i=0;i<5;i++){
                System.out.println(thread.getName()+"在插入数据"+i);
                arrayList.add(i);
            }
        }
    }
}
class InsertData {
    private ArrayList<Integer> arrayList = new ArrayList<Integer>();
    private Object object = new Object();
    
    public void insert(Thread thread){
     
   synchronized (object) {
            for(int i=0;i<5;i++){
                System.out.println(thread.getName()+"在插入数据"+i);
                arrayList.add(i);
            }
        }
    }
}

调用:
    public static void main(String[] args)  {
        final InsertData insertData = new InsertData();
        
        new Thread() {
            public void run() {
                insertData.insert(Thread.currentThread());
            };
        }.start();
        
        
        new Thread() {
            public void run() {
                insertData.insert(Thread.currentThread());
            };
        }.start();
    } 
}
 

结果:


从上面可以看出: synchronized代码块使用起来比synchronized方法要灵活得多。因为也许一个方法中只有一部分代码只需要同步,如果此时对整个方法用synchronized进行同步,会影响程序执行效率。而使用synchronized代码块就可以避免这个问题,synchronized代码块可以实现只对需要同步的地方进行同步。

posted @ 2022-07-14 10:12  烟笼寒山  阅读(2852)  评论(0)    收藏  举报