25.Java锁的深度化

Java锁的深度化

悲观锁、乐观锁、排他锁

场景

当多个请求同时操作数据库时,首先将订单状态改为已支付,在金额加上200,在同时并发场景查询条件下,会造成重复通知。 SQL: Update

悲观锁与乐观锁
  • 悲观锁:
    悲观锁悲观的认为每一次操作都会造成更新丢失问题,在每次查询时加上排他锁。 每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
  • 乐观锁:
    乐观锁会乐观的认为每次查询都不会造成更新丢失,利用版本字段控制

    重入锁

    锁作为并发共享数据,保证一致性的工具,在JAVA平台有多种实现(如 synchronized 和 ReentrantLock等等 ) 。这些已经写好提供的锁为我们开发提供了便利。 重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。 在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁

public class SynchronizedTest implements Runnable {
    public synchronized void get(){
        System.out.println(Thread.currentThread().getName()+" get()");
        set();
    }

    private synchronized void set() {
        System.out.println(Thread.currentThread().getName()+" set()");
    }

    @Override
    public void run() {
        get();
    }
    public static void main(String[] args){
        SynchronizedTest test = new SynchronizedTest();
        new Thread(test).start();
        new Thread(test).start();
        new Thread(test).start();
        new Thread(test).start();
    }
    //Thread-0 get()
    //Thread-0 set()
    //Thread-3 get()
    //Thread-3 set()
    //Thread-2 get()
    //Thread-2 set()
    //Thread-1 get()
    //Thread-1 set()
}

import java.util.concurrent.locks.ReentrantLock;

public class ReentrantLockDemo extends Thread{
    ReentrantLock lock = new ReentrantLock();
    public void get(){
        lock.lock();
        System.out.println(Thread.currentThread().getId());
        set();
        lock.unlock();
    }

    private void set() {
        lock.lock();
        System.out.println(Thread.currentThread().getId());
        lock.unlock();
    }

    @Override
    public void run() {
        get();
    }
    public static void main(String[] args){
        ReentrantLockDemo demo = new ReentrantLockDemo();
        new Thread(demo).start();
        new Thread(demo).start();
        new Thread(demo).start();
    }
    //10
    //10
    //11
    //11
    //12
    //12
}

读写锁

相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些。假设你的程序中涉及到对一些共享资源的读和写操作,且写操作没有读操作那么频繁。 在没有写操作的时候,两个线程同时读一个资源没有任何问题,所以应该允许多个线程能在同时读取共享资源。但是如果有一个线程想去写这些共享资源, 就不应该再有其它线程对该资源进行读或写(读-读能共存,读-写不能共存,写-写不能共存)。

原子类

java.util.concurrent.atomic包:原子类的小工具包,支持在单个变量上解除锁的线程安全编程
原子变量类相当于一种泛化的 volatile 变量,能够支持原子的和有条件的读-改-写操作。AtomicInteger 表示一个int类型的值,并提供了 get 和 set 方法,这些 Volatile 类型的int变量在读取和写入上有着相同的内存语义。它还提供了一个原子的 compareAndSet 方法(如果该方法成功执行,那么将实现与读取/写入一个 volatile 变量相同的内存效果),以及原子的添加、递增和递减等方法。AtomicInteger 表面上非常像一个扩展的 Counter 类,但在发生竞争的情况下能提供更高的可伸缩性,因为它直接利用了硬件对并发的支持。

为什么会有原子类

  • CAS:Compare and Swap,即比较再交换。
    jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。
  • 如果同一个变量要被多个线程访问,则可以使用该包中的类(原子类)
    • AtomicBoolean
    • AtomicInteger
    • AtomicLong
    • AtomicReference

      常用原子类

      Java中的原子操作类大致可以分为4类:原子更新基本类型、原子更新数组类型、原子更新引用类型、原子更新属性类型。这些原子类中都是用了无锁的概念,有的地方直接使用CAS操作的线程安全的类型。


import java.util.concurrent.atomic.AtomicInteger;

public class AtomicIntegerDemo implements Runnable{
    private static Integer count = 1;
    private static AtomicInteger atomicInteger = new AtomicInteger();

    @Override
    public void run() {
        while (true){
//            int count = getCount();
            int count = getCountAtomic();
            System.out.println(count);
            if (count>=50){
                break;
            }
        }
    }

    private Integer getCountAtomic() {
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return atomicInteger.incrementAndGet();
    }

    public synchronized Integer getCount(){
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return count++;
    }
    public static void main(String[] args){
        AtomicIntegerDemo demo = new AtomicIntegerDemo();
        Thread t1 = new Thread(demo);
        Thread t2 = new Thread(demo);
        t1.start();
        t2.start();
    }
}

CAS(乐观锁算法)无锁机制

  • 与锁相比,使用比较交换(下文简称CAS)会使程序看起来更加复杂一些。但由于其非阻塞性,它对死锁问题天生免疫,并且,线程间的相互影响也远远比基于锁的方式要小。更为重要的是,使用无锁的方式完全没有锁竞争带来的系统开销,也没有线程间频繁调度带来的开销,因此,它要比基于锁的方式拥有更优越的性能。
  • 无锁的好处:
    • 在高并发的情况下,它比有锁的程序拥有更好的性能
    • 它天生就是死锁免疫的

      CAS缺点

      CAS存在一个很明显的问题,即ABA问题。
  • 问题:如果变量V初次读取的时候是A,并且在准备赋值的时候检查到它仍然是A,那能说明它的值没有被其他线程修改过了吗?
    如果在这段期间曾经被改成B,然后又改回A,那CAS操作就会误认为它从来没有被修改过。针对这种情况,java并发包中提供了一个带有标记的原子引用类AtomicStampedReference,它可以通过控制变量值的版本来保证CAS的正确性。

    AtomicReference
  • AtomicReference用以支持对象的原子操作:AtomicReference 可以封装引用一个V实例
  • public final boolean compareAndSet(V expect, V update) ,可以支持并发访问,set的时候进行对比判断,如果当前值和操作之前一样则返回false,否则表示数据没有变化


import java.util.concurrent.atomic.AtomicReference;

/**
 * CAS算法:它包含三个参数CAS(V,E,N): V表示要更新的变量,E表示预期值,N表示新值。
 * 仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。
 * 最后,CAS返回当前V的真实值
 */
public class SpinLockDemo implements Runnable {
    static int sum;
    private SpinLock lock;
    public SpinLockDemo(SpinLock lock) {
        this.lock = lock;
    }
    @Override
    public void run() {
        this.lock.lock();
        sum++;
        this.lock.unlock();
    }
    public static void main(String[] args) throws InterruptedException{
        SpinLock spinLock = new SpinLock();
        for (int i = 0; i < 100; i++) {
            SpinLockDemo demo = new SpinLockDemo(spinLock);
            Thread thread = new Thread(demo);
            thread.start();
        }
        Thread.currentThread().sleep(1000);
        System.out.println(sum);//100
    }
}

//自旋锁是采用让当前线程不停地的在循环体内执行实现的,当循环的条件被其他线程改变时 才能进入临界区
class SpinLock{
    //Java中的原子操作(CAS)
    //持有自旋锁的线程对象
    AtomicReference<Thread> sign = new AtomicReference<>();
    public void lock(){
        Thread thread = Thread.currentThread();
        //lock函数将thread设置为当前线程,并且预测原来的值为null
        //当有第二个线程调用lock操作时由于thread的值不为空,导致循环
        //一直被执行,直至第一个线程调用unclock函数将sign设置为null,第二个线程才能进入临界区
        while (!sign.compareAndSet(null,thread));
    }
    public void unlock(){
        //unlock将sign的值设置为null,并且预测值为当前线程
        Thread thread = Thread.currentThread();
        sign.compareAndSet(thread,null);
    }
}

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;

public class AtomicReferenceTest {
    private static AtomicReference<Integer> ar = new AtomicReference<>(0);
    public static void test() throws InterruptedException{
        int count = 3;
        final int c = 3;
        final CountDownLatch latch = new CountDownLatch(count);
        for (int i = 0; i < count; i++) {
            new Thread(()->{
                for (int j = 0; j < c; j++) {
                    while (true){
                        Integer temp = ar.get();
                        System.out.println("temp="+temp);
                        //public final boolean compareAndSet(V expect, V update)
                        if (ar.compareAndSet(temp,temp+1)){
                            break;
                        }
                    }
                }
                latch.countDown();
            }).start();
        }
        latch.await();
        System.out.println(ar.get());
    }
    public static void main(String[] args) throws InterruptedException{
        test();
        //temp=0
        //temp=0
        //temp=1
        //temp=2
        //temp=1
        //temp=3
        //temp=3
        //temp=4
        //temp=4
        //temp=5
        //temp=5
        //temp=6
        //temp=7
        //temp=8
        //9
    }
}

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 原子量实现的计数器
 */
public class AtomicCounter {
    private AtomicInteger value = new AtomicInteger();
    public int getValue(){
        return value.get();
    }
    //+1
    public int increase(){
        // return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
        return value.incrementAndGet();
    }
    //+delta
    public int increase(int delta){
        // return unsafe.getAndAddInt(this, valueOffset, delta) + delta;
        return value.addAndGet(delta);
    }
    //-1
    public int decrease(){
        // return unsafe.getAndAddInt(this, valueOffset, -1) - 1;
        return value.decrementAndGet();
    }
    //-delta
    public int decrease(int delta){
        // return unsafe.getAndAddInt(this, valueOffset, delta) + delta;
        return value.addAndGet(-delta);
    }
    public static void main(String[] args){
        final AtomicCounter counter = new AtomicCounter();
        ExecutorService threadPool = Executors.newCachedThreadPool();
        for (int i = 0; i < 10; i++) {
            threadPool.execute(()->{
                System.out.println(counter.increase(2));
            });
        }

        threadPool.shutdown();
    }
}

import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicLong;

/**
 * 原子量实现的银行取款
 */
public class AtomicAccount {
    private AtomicLong balance;

    public AtomicAccount(long money) {
        balance = new AtomicLong(money);
        System.out.println("Total Money:"+balance);
    }
    //存钱
    public void deposit(long money){
        balance.addAndGet(money);
    }
    //取钱
    public void withdraw(long money){
        for (;;){
            long oldValue = balance.get();
            if (oldValue<money){
                System.out.println(Thread.currentThread().getName()+" 余额不足!"+" 余额:"+balance);
                break;
            }
            try {
                Thread.sleep(new Random().nextInt(1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (balance.compareAndSet(oldValue,oldValue-money)){
                System.out.println(Thread.currentThread().getName()+" 取款:"+money + " 余额:"+balance);
                break;
            }
            System.out.println(Thread.currentThread().getName() + " 遇到并发,再次尝试取款!");
        }
    }
    public static void main(String[] args){
        final AtomicAccount account = new AtomicAccount(1000);
        ExecutorService threadPool = Executors.newCachedThreadPool();
        int i = 0;
        while (i++<13){
            threadPool.execute(()->{
                account.withdraw(100);
            });
        }
        threadPool.shutdown();
    }
    //Total Money:1000
    //pool-1-thread-13 取款:100 余额:900
    //pool-1-thread-6 遇到并发,再次尝试取款!
    //pool-1-thread-7 遇到并发,再次尝试取款!
    //pool-1-thread-5 遇到并发,再次尝试取款!
    //pool-1-thread-10 遇到并发,再次尝试取款!
    //pool-1-thread-2 遇到并发,再次尝试取款!
    //pool-1-thread-3 遇到并发,再次尝试取款!
    //pool-1-thread-1 遇到并发,再次尝试取款!
    //pool-1-thread-4 遇到并发,再次尝试取款!
    //pool-1-thread-8 遇到并发,再次尝试取款!
    //pool-1-thread-9 遇到并发,再次尝试取款!
    //pool-1-thread-11 遇到并发,再次尝试取款!
    //pool-1-thread-12 遇到并发,再次尝试取款!
    //pool-1-thread-8 取款:100 余额:800
    //pool-1-thread-1 遇到并发,再次尝试取款!
    //pool-1-thread-5 遇到并发,再次尝试取款!
    //pool-1-thread-6 遇到并发,再次尝试取款!
    //pool-1-thread-5 取款:100 余额:700
    //pool-1-thread-11 遇到并发,再次尝试取款!
    //pool-1-thread-4 遇到并发,再次尝试取款!
    //pool-1-thread-7 遇到并发,再次尝试取款!
    //pool-1-thread-4 取款:100 余额:600
    //pool-1-thread-10 遇到并发,再次尝试取款!
    //pool-1-thread-2 遇到并发,再次尝试取款!
    //pool-1-thread-6 遇到并发,再次尝试取款!
    //pool-1-thread-3 遇到并发,再次尝试取款!
    //pool-1-thread-3 取款:100 余额:500
    //pool-1-thread-9 遇到并发,再次尝试取款!
    //pool-1-thread-10 遇到并发,再次尝试取款!
    //pool-1-thread-9 取款:100 余额:400
    //pool-1-thread-11 遇到并发,再次尝试取款!
    //pool-1-thread-2 遇到并发,再次尝试取款!
    //pool-1-thread-11 取款:100 余额:300
    //pool-1-thread-1 遇到并发,再次尝试取款!
    //pool-1-thread-12 遇到并发,再次尝试取款!
    //pool-1-thread-7 遇到并发,再次尝试取款!
    //pool-1-thread-2 遇到并发,再次尝试取款!
    //pool-1-thread-7 取款:100 余额:200
    //pool-1-thread-2 遇到并发,再次尝试取款!
    //pool-1-thread-6 遇到并发,再次尝试取款!
    //pool-1-thread-10 遇到并发,再次尝试取款!
    //pool-1-thread-1 遇到并发,再次尝试取款!
    //pool-1-thread-12 遇到并发,再次尝试取款!
    //pool-1-thread-2 取款:100 余额:100
    //pool-1-thread-12 遇到并发,再次尝试取款!
    //pool-1-thread-12 取款:100 余额:0
    //pool-1-thread-6 遇到并发,再次尝试取款!
    //pool-1-thread-6 余额不足! 余额:0
    //pool-1-thread-10 遇到并发,再次尝试取款!
    //pool-1-thread-10 余额不足! 余额:0
    //pool-1-thread-1 遇到并发,再次尝试取款!
    //pool-1-thread-1 余额不足! 余额:0
}

转载于:https://www.cnblogs.com/fly-book/p/11454217.html

IQA图像质量评价 数据集介绍(LIVE、TID2013、CSIQ、LIVEC、KonIQ-10K) LIVE、TID2013、CSIQ、LIVEC、KonIQ-10K 数据集介绍 阅读详情

相关推荐

2025年人形机器人产业研究

人形机器人是一种模仿人类外形、动作和行为的机器人,旨在替代或辅助人类完成各种任务。其显著特征包括人类外形、动作模仿和智能交互能力。根据形态和功能,人形机器人可分为小型、中型、大型以及服务型、工业型、救援型和娱乐型等类别。发展历程经历了初始阶段、高度集成系统阶段和突破性进展阶段,技术不断进步。关键技术包括执行系统、控制系统和感知与交互系统,涉及机械结构、运动控制、平衡控制、任务执行控制以及感知与交互能力。主要研究方向包括外部仿人化和内部仿生,前者关注外观设计、动作控制和任务执行能力,后者致力于模拟人类核心机制

一名80后IT人的成长记录,记录自己在工作、学习中的点点滴滴,在成长的喜悦与忧心的故事里,铭记反脆弱的勇气。 1567

Java锁的深度化

一、悲观锁 1、概念 悲观锁悲观的认为每一次操作都会造成更新丢失问题,在每次查询时加上排他锁。 每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 2、sql语句 for update 标识为使用悲观锁 Select * from ...

LiGuogang 285

抖音直播间人气接口算法 抖音协议

抖音直播间人气接口算法 抖音协议 抖音算法

Q44804487的博客 1万+

深入理解JUC:第三章:AtomicReference原子引用

第一章讲解了volatile不保证原子性,为解决原子性使用了AtomicInteger原子整型,解决了基本类型运算操作的原子性的问题,那我们自定义的实体类或者基本数据类型都要保证原子性呢?使用AtomicReference原子引用 AtomicInteger原子整型: package com.javaliao.backstage; import java.util.concurrent.a...

我是Java程序员廖志伟,感谢朋友们的支持! 3045

CHARLS数据库下载避坑指南:从注册到数据获取的完整流程(2023最新版)

本文提供2023年最新版CHARLS数据库下载与使用全流程指南,涵盖从注册、数据申请到清洗的高效实践。重点解析邮箱选择、协议签署等关键步骤,并分享多线程下载、格式转换等实用技巧,助力研究者快速获取并处理这一中国中老年健康研究的黄金标准数据。

red88的博客 920

DeepSeek提示词实战:从零到百的AI角色扮演指南(附100+场景模板)

本文提供了一份详尽的DeepSeek提示词实战指南,重点讲解AI角色扮演的核心技巧。通过“角色扮演四要素法”和五大核心场景模板,帮助用户从零开始掌握如何设计高质量提示词,有效提升AI输出的深度与精度,并附赠100+实用场景模板供参考。

weixin_29305337的博客 579

多线程(五、原子类-AtomicReference)

AtomicReference 原子方式更新对象引用 举例:1000个线程,对一个Integer累加1,直到1000 启动文件 package com.jane; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicReference; public class ...

weixin_34329187的博客 426

TCGA数据集介绍及数据下载指南(新手友好篇)

目录一、TCGA数据集介绍1.1 数据集介绍1.2 File介绍1.2.1 Data Category(数据类别)1.2.2 Data Type(数据类型)1.2.3 Experimental Strategy(实验策略)1.2.4 Workflow Type(工作流类型)1.2.5 Data Format(数据格式)1.2.6 Platform(平台)1.2.7 Access1.3 Cases介绍1.3.1 Case ID(案例编号)1.3.2 Primary Site(主要站点)1.3.3 Progra

Wendy的博客 6万+

Java并发编程学习(8):CAS机制、原子变量

示例引入 我们需要执行一个高并发削减账户余额的逻辑。为方便起见,我们将账户类设计为一个抽象类,并且只对中的静态demo()方法进行了实现。 在demo()方法中,我们会生成若干线程,每个线程执行同样的逻辑:扣除账户中的余额。当全部线程执行完毕后,方法会打印账户的余额数量以及执行程序的用时。 abstract class Account{ abstract String getName(); abstract int getBalance(); abstract void wi

weixin_43968383的博客 412

OpenCV和Halcon分别实现彩色图像的白平衡效果

实现白平衡算法中的灰度世界法,能有效改善图像发红/发蓝/发绿的现象 1、OpenCV #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat g_srcImage,dstImage; vector<Mat> g_vChannels; g_srcImage = im...

$firecat利白的代码足迹$ 2829

SAP MIRO发票自动化:BAPI_INCOMINGINVOICE_CREATE实战解析

本文深入解析了如何使用SAP标准BAPI_INCOMINGINVOICE_CREATE实现MIRO发票校验流程的自动化。通过实战代码示例,详细阐述了从采购订单和收货凭证获取数据、构建BAPI核心参数、处理常见错误到高级场景优化的完整路径,旨在帮助SAP开发人员构建稳定、高效的自动化解决方案,提升财务处理效率与准确性。

weixin_29243279的博客 499

java 原子量Atomic举例(AtomicReference)

并发原子量

王鹏亮 的专栏 1万+

IEC 61400-1:2019 附录 C 湍流模型全面解读

IEC 61400-1:2019 附录 C 全面解读

weixin_46713695的博客 471

【JVM级性能跃迁】:Java 25虚拟线程在实时风控系统的SLA突破——P99延迟从820ms降至43ms

Java 25虚拟线程在高并发架构下的实践为企业级应用场景带来质变:通过轻量级线程模型重构实时风控系统,P99延迟从820ms降至43ms,显著提升SLA达标率。适用于金融风控、实时推荐等低延迟高吞吐场景,值得收藏。

DeepNest的博客 405

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java锁升级机制深度解析:从偏向锁到重量级锁的完整演进之路

Java的锁升级机制是JVM并发优化艺术的杰出体现。它通过四级锁状态的无缝切换,在安全与性能之间找到了精妙的平衡点。理解这一机制不仅有助于编写高性能的并发代码,更能让我们深入理解JVM的设计哲学。从无锁到重量级锁的每一步升级,都是对当前竞争状况的智能响应。虽然偏向锁在现代JDK中逐渐淡出,但锁升级的核心思想——根据实际情况动态调整同步策略——依然是我们设计并发系统时需要遵循的重要原则。

用文字记录技术,用分享回馈社区,用坚持见证成长 1222

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

深度了解JVM中synchronized怎样实现及锁类型讲解

深度了解synchroized锁升级过程以及synchroized在jvm中是怎么运行的。

m0_70301931的博客 3848

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【Java synchronized锁升级深度解析】:从对象头到CAS,揭秘锁升级全过程

深入解析Java synchronized的锁升级日志,揭示对象头、CAS与锁升级机制。涵盖偏向锁、轻量级锁到重量级锁的触发条件与性能影响,适用于高并发场景优化。原理清晰,实战性强,值得收藏。

VarIsle的博客 1036

Java锁性能全面对比分析,Java锁实现原理深度解析

本文对比分析了Java中synchronized、ReentrantLock、ReadWriteLock和StampedLock的性能特点。synchronized在低并发下表现良好但高并发性能下降;ReentrantLock功能更丰富,高并发性能更优;ReadWriteLock适合读多写少场景;StampedLock的乐观读模式在读多写少时性能最佳。文章建议根据并发程度、读写比例等场景特点选择锁机制,并指出锁粒度、竞争程度和JVM优化是影响性能的关键因素,提供了Web应用、数据库事务等不同场景下的锁选型指

子柚的博客 567

java|深度详细剖析锁的底层实现原理

java锁的剖析 无锁状态,偏向锁状态,轻量级锁状态,重量级锁状态 内存中的java对象(HotSpot虚拟机) 在32位系统下,存放Class指针的空间大小是4字节,MarkWord是4字节,对象头为8字节。 在64位系统下,存放Class指针的空间大小是8字节,MarkWord是8字节,对象头为16字节。 在64位开启指针压缩的情况下 -XX:+UseCompressedOops,存放Class指针的空间大小是4字节,MarkWord是8字节,对象头为12字节。

qq_37419449的博客 7344

【java都30岁啦】Java 25 学习

Java是一门面向对象的编程语言,由Sun公司于1995年正式发布,其设计理念源于对C 语言的改进,摒弃了多继承和指针等复杂概念,实现了功能强大与简单易用的结合。作为静态面向对象编程语言的代表,Java通过JVM(Java虚拟机)实现跨平台运行,具备分布式、健壮性、安全性、多线程等特性,支持桌面应用、Web应用和嵌入式系统开发。该语言经历多个重要版本迭代,2006年Sun公司将Java开源,2009年甲骨文公司完成对Sun的收购后持续推进技术更新。

一个写了10年bug的程序员日常笔记。 2159

深度解析:如何优化Java中的锁使用,性能提升300%的实战秘籍

深度解析:如何优化Java中的锁使用,性能提升300%的实战秘籍

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 958

深度解析Java中synchronized的实现原理

是Java中最基本的同步机制,主要用于解决多线程并发访问的原子性、可见性和有序性问题。

ssp的博客 759

Java synchronized 锁升级全过程深度解析:从 Mark Word 到偏向锁、轻量级锁与重量级锁的 HotSpot 实现

本文深入解析Java中synchronized关键字的多级锁升级机制。从对象头Mark Word的位图结构入手,详细阐述了偏向锁(无竞争优化)、轻量级锁(CAS+自旋)和重量级锁(OS阻塞)的实现原理。重点分析了锁状态转换路径、偏向锁撤销的安全点机制、自适应自旋优化策略,以及ObjectMonitor的膨胀逻辑。通过HotSpot源码解析,揭示了synchronized从字节码到JVM底层的完整执行路径。文章还对比了不同JDK版本的锁机制差异,并给出编写锁友好代码的实践建议。最终总结了JVM锁优化的核心思想

xinzhiyishi的博客 1114

Java synchronized实现原理深度解析:从字节码到锁升级

是Java语言提供的内置同步机制,用于保证多线程环境下共享资源的互斥访问和内存可见性。与JUC包中的Lock接口不同,synchronized的实现完全由JVM底层完成,对开发者完全透明。三种用法用法锁对象示例同步实例方法当前实例对象this同步静态方法当前类的Class对象同步代码块括号中指定的对象📌核心认知:Java中每一个对象都可以作为锁,这是synchronized实现同步的基础。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 247

synchronized 锁升级路径深度解析

摘要:本文深度解析synchronized锁升级路径,从无锁状态到重量级锁的完整演进过程。详细剖析了偏向锁、轻量级锁和重量级锁的实现机制,包括Mark Word内存布局、锁状态转换条件及优化策略。重点讲解了对象头结构(64位JVM下)、锁撤销流程、自旋优化以及生产环境调优方法。通过状态机图示和代码示例,展示了不同锁状态下Mark Word的位域变化,为开发者提供从理论到实践的完整锁升级知识体系,帮助优化高并发场景下的锁性能。

qq_43414012的博客 1343

Java 锁膨胀机制深度解析:从偏向锁到重量级锁的进化之路

场景:竞争激烈,锁持有时间长,自旋浪费大量 CPU 资源。优化策略:使用操作系统底层的互斥量(Mutex)。线程获取不到锁时,直接挂起(阻塞),进入等待队列,让出 CPU 给其他线程。JVM 的锁膨胀机制体现了计算机科学中经典的**“以空间换时间”和锁状态适用场景核心优化手段代价偏向锁单线程重入记录线程 ID,无 CAS,无同步开销撤销时需 STW轻量级锁低竞争,短时持有CAS + 自旋(避免内核切换)占用栈空间,自旋耗 CPU重量级锁高竞争,长时持有操作系统 Mutex,线程阻塞挂起。

2609_95039349的博客 422
上一篇: 线程池(ThreadPool)创建
下一篇: 同步容器
dffxwe51549
博客等级 码龄12年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值