什么是synchronized关键字?

  • Post category:Java

什么是synchronized关键字?

synchronized是Java关键字,通常用于保证多个线程在竞态条件下互斥访问某些共享状态(例如变量或对象)的访问,以避免并发问题的出现。synchronized可以用于方法和代码块两种形式。

使用攻略:

1. synchronized关键字修饰方法

当我们希望一个方法在执行的过程中,是线程安全的,即多个线程同时访问该方法,不会出现同步问题,那我们可以使用synchronized关键字修饰该方法。

语法:public synchronized void function() { ... }

示例:

class MyThread extends Thread{
    private static int ticket = 100; //共享数据
    public void run(){
        while(ticket > 0){
            sale();
        }
    }
    public synchronized void sale(){ //同步方法
        if(ticket > 0){
            System.out.println(Thread.currentThread().getName()+" 还剩余 "+ticket--+" 张票");
        }
    }
}

2. synchronized关键字修饰代码块

当一个方法不需要完全同步,只是某段代码需要同步时,我们就可以使用synchronized关键字来修饰该代码块。在代码块执行期间,其他线程将无法执行这个代码块的方法部分。如果要锁定对象,则可以将代码块括在synchronized(this) {}中。

语法:synchronized(Object object){ ... }

示例:

class MyThread extends Thread{
    private Object lock;
    public MyThread(Object lock){
        this.lock = lock;
    }
    public void run(){
        synchronized (lock){ //同步代码块
            System.out.println(Thread.currentThread().getName()+" get the lock");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName()+" release the lock");
        }
    }
}

总结

synchronized关键字用于保证多个线程对共享状态的互斥访问,可以用于方法和代码块两种形式。使用synchronized关键字时,需要注意以下几点:

  1. 给对象加锁时,需要选取一个通用的对象作为锁。
  2. 不要在synchronized代码块中调用会抛出异常的方法,否则可能会导致锁无法释放。
  3. 在锁定代码块时,应尽量缩小锁定范围,以提高程序的性能。