java 几种锁实现

public class SyncronizedTest {

    private int value = 1;
    private AtomicInteger value1 = new AtomicInteger(1);
    private Lock lock = new ReentrantLock();

    //sycronized
    public synchronized int getValue() {
        return value ++ ;
    }

    //jdk自带原子操作
    public int getValue1() {
        return value1.getAndIncrement();
    }

    //lock
    public int getValue2() {
        lock.lock();
        int a = value ++ ;
        lock.unlock();
        return a;
    }

    public static void main(String[] args) {

        //此处必须使用同一个实例对象,因为synchronized锁此处针对的是对象,如果实例化2个对象相当于每个对象有一把锁
        SyncronizedTest syncronizedTest = new SyncronizedTest();
        long startTime = System.currentTimeMillis();

        Runnable runnable = () -> {
            for(int i = 0; i < 100; i ++){
                System.out.println(Thread.currentThread().getName() + ",值:" + syncronizedTest.getValue());
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        Thread thread1 = new Thread(runnable);
        thread1.start();
        Thread thread2 = new Thread(runnable);
        thread2.start();
        Thread thread3 = new Thread(runnable);
        thread3.start();
        Thread thread4 = new Thread(runnable);
        thread4.start();
        Thread thread5 = new Thread(runnable);
        thread5.start();

        while (thread1.isAlive() || thread2.isAlive() || thread3.isAlive() || thread4.isAlive() || thread5.isAlive()) {
            //自旋
        }
        long endTime = System.currentTimeMillis();
        System.out.println("耗时:"+ (endTime - startTime));
    }
}

 

性能对比说明:https://www.cnblogs.com/flying607/p/5733043.html

转载于:https://www.cnblogs.com/gyli20170901/p/10873777.html

Java 中的机制主要分为以下几种: 1. 公平和非公平:公平按照请求的顺序来决定获取的顺序,而非公平则不保证顺序,可能会导致某些线程长时间得不到。 2. 可重入(Reentrant Lock):也称递归,指的是线程可以重复获取同一把。比如在方法A中获得了这把,在方法A的内部调用另一个需要同一把的方法B,那么当前线程可以直接进入方法B,而不会被阻塞。 3. 独享和共享:独享指的是每次只有一个线程能持有,比如synchronized和ReentrantLock。共享则是允许多个线程同时获取,并发访问资源,如读操作的。 4. 乐观和悲观:乐观假设不会出现冲突,在操作数据时不会上,而是通过版本号或时间戳等机制来实现冲突检测。悲观则假定冲突的可能性很大,每次对数据的访问都会加。 5. 自旋:在尝试获取时,如果已经被其他线程占用,线程不会立即进入阻塞状态,而是会空循环等待一段时间,这段时间称为自旋。如果在这段时间内获得了,那么就避免了线程切换的开销。 6. 读写(ReadWriteLock):允许在没有写时多个读并存,提高读操作的并发性。写会排斥读和写,保证写操作的原子性。 7. 分段:在一些容器类中使用,将数据分为多个段,每个段独立上,使得操作更加分散,提高并发性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值