JavaSE进阶

15.4.3 同步锁(Lock)

从Java 5开始,Java提供了更强大的线程同步机制——通过显式定义同步锁对象来实现同步。同步锁使用Lock对象充当。

Lock是控制多个线程对共享资源进行访问的工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应先获得Lock对象。

在实现线程安全的控制中,比较常用的是ReentrantLock(可重入锁),可以显式加锁、释放锁。

 

class A {

    private final ReentrantLock lock = new ReenTrantLock();

 

    public void m() {

        lock.lock();

        try {

            // 保证线程安全的代码;

        } finally {

            lock.unlock();

        }

    }

}

 

 

15.4.4 互斥锁

  • 在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。
    • 每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
    • 关键字synchronized 来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
    • 同步的局限性:导致程序的执行效率要降低
    • 同步方法(非静态的)的锁为this。

             同步方法(静态的)的锁为当前类本身。

class Singleton {

    private static Singleton instance = null;

 

    private Singleton() {

    }

 

    public static Singleton getInstance() {

        if (instance == null) {

            synchronized (Singleton.class) {

                if (instance == null) {

                    instance = new Singleton();

                }

            }

        }

        return instance;

    }

}

 

public class TestSingleton {

    public static void main(String[] args) {

        Singleton s1 = Singleton.getInstance();

        Singleton s2 = Singleton.getInstance();

        System.out.println(s1 == s2);

    }

}

 


上一篇:
下一篇: