概述

实现线程同步的三种方式

  • 同步代码块
  • 同步方法
  • Lock

同步代码块

例如:

public void test(){
	synchronized (XXX){
		...
	}
}

在同步代码块 XXX中可以传入以下几个值

  • 锁对象 比如new Object()对象 比如this对象
  • class对象 比如this.getClass()对象 比如类名.class

当传入锁对象时,线程争抢的就是锁对象

锁对象一定要是同一个,否则就无法保证线程同步

当传入class对象时,线程争抢的就是class对象

因为同一个类的不同实例的class对象都是同一个,所以没有上述传入锁对象存在的问题

同步方法

同步方法中又分为两种:

  • 普通同步方法
  • 静态同步方法

例如:

普通同步方法

public synchronized void test(){
	...
}

锁的是同一个类的实例对象

静态同步方法

public static synchronized void test(){
	...
}

锁的是类对象

Lock

Lock是一个顶层接口,它的实现类有 ReentrantLock

简单Demo

public class TestLock {

    public static void main(String[] args) throws InterruptedException {

        ValueIncr valueIncr = new ValueIncr();

        //启动10个线程进行累加
        for(int i=0;i<10;i++){
            new Thread(valueIncr).start();
        }

        //等待线程执行完毕
        Thread.sleep(1000);

        //打印累加结果
        System.out.println(valueIncr.value);

    }

}

class ValueIncr implements Runnable{
    //创建一个可重入锁
    static Lock lock=new ReentrantLock();
  
    //记录累加值
    int value;

    @Override
    public void run() {
        incr(); //递增
    }

    public void incr(){
        //上锁
        lock.lock();
        try {
            value++;
        }finally {
            //释放锁
            lock.unlock();
        }
    }
}
0条评论
头像
ICP证 : 浙ICP备18021271号