Java使用synchronized实现互斥锁功能示例

  

实现互斥锁是多线程编程中常见的问题,Java中提供了synchronized关键字来实现互斥锁功能。

1. synchronized基本用法

1.1 使用在方法上

在方法上使用synchronized关键字,可以实现对当前对象的方法加锁,使得同一时间只能有一个线程访问该方法。

public class SynchronizedExample {
    public synchronized void doSomething(){
        // 执行需要互斥的代码
    }
}

1.2 使用在代码块上

使用synchronized关键字还可以使用在代码块上,可以实现对当前对象或指定对象加锁。

public class SynchronizedExample {
    public void doSomething(){
        synchronized(this){
            // 执行需要互斥的代码
        }
    }

    public void doSomething2(Object lock){
        synchronized(lock){
            // 执行需要互斥的代码
        }
    }
}

2. 示例说明

2.1 示例一

下面的示例演示了如何使用synchronized关键字实现对多线程操作的代码块进行互斥的效果:

public class SynchronizedExample {
    private int count = 0;
    private Object lock = new Object();

    public void add(){
        synchronized(lock){
            count++;
        }
    }

    public int getCount(){
        synchronized(lock){
            return count;
        }
    }
}

在上面的代码中,我们使用了一个对象lock作为锁来控制对count变量的访问。通过在add()和getCount()方法中使用synchronized关键字,实现了对count变量的访问加互斥锁的效果。

2.2 示例二

下面的示例演示了如何使用synchronized关键字实现对多线程操作的静态方法进行互斥的效果:

public class SynchronizedExample {
    private static int count = 0;

    public synchronized static void add(){
        count++;
    }

    public synchronized static int getCount(){
        return count;
    }
}

在上面的代码中,我们使用synchronized关键字在静态方法add()和getCount()中进行加锁,来实现对静态变量count的互斥访问。因为静态变量是属于类的,所以加锁的对象是类本身。

相关文章