您好、欢迎来到现金彩票网!
当前位置:老k棋牌 > 争用条件 >

Java中的ReentrantLock和synchronized两种锁定机制的对比

发布时间:2019-06-20 01:16 来源:未知 编辑:admin

  多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个类,可以用它来构建、启动和操纵线程,Java 语言包括了跨线程传达并发性约束的构造 ——。在简化与平台无关的并发类的开发的同时,它决没有使并发类的编写工作变得更繁琐,只是使它变得更容易了。

  把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有原子性(atomicity)和可见性(visibility)。原子性意味着一个线程一次只能执行由一个指定监控对象(lock)保护的代码,从而防止多个线程在更新共享状态时相互冲突。可见性则更为微妙;它要对付内存缓存和编译器优化的各种反常行为。一般来说,线程以某种不必让其他线程立即可以看到的方式(不管这些线程在寄存器中、在处理器特定的缓存中,还是通过指令重排或者其他编译器优化),不受缓存变量值的约束,但是如果开发人员使用了同步,如下面的代码所示,那么运行库将确保某一线程对变量所做的更新先于对现有synchronized块所进行的更新,当进入由同一监控器(lock)保护的另一个synchronized块时,将立刻可以看到这些对变量所做的更新。类似的规则也存在于volatile变量上。

  所以,实现同步操作需要考虑安全更新多个共享变量所需的一切,不能有争用条件,不能破坏数据(假设同步的边界位置正确),而且要保证正确同步的其他线程可以看到这些变量的最新值。通过定义一个清晰的、跨平台的内存模型(该模型在 JDK 5.0 中做了修改,改正了原来定义中的某些错误),通过遵守下面这个简单规则,构建“一次编写,随处运行”的并发类是有可能的:

  不过现在好了一点,在最近的 JVM 中,没有争用的同步(一个线程拥有锁的时候,没有其他线程企图获得锁)的性能成本还是很低的。(也不总是这样;早期 JVM 中的同步还没有优化,所以让很多人都这样认为,但是现在这变成了一种误解,人们认为不管是不是争用,同步都有很高的性能成本。)

  如此看来同步相当好了,是么?那么为什么 JSR 166 小组花了这么多时间来开发框架呢?答案很简单-同步是不错,但它并不完美。它有一些功能性的限制 —— 它无法中断一个正在等候获得锁的线程,也无法通过投票得到锁,如果不想等下去,也就没法得到锁。同步还要求锁的释放只能在与获得锁所在的堆栈帧相同的堆栈帧中进行,多数情况下,这没问题(而且与异常处理交互得很好),但是,确实存在一些非块结构的锁定更合适的情况。

  java.util.concurrent.lock中的Lock框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现。这就为Lock的多种实现留下了空间,各种实现可能有不同的调度算法、性能特性或者锁定语义。ReentrantLock类实现了Lock,它拥有与synchronized相同的并发性和内存语义,但是添加了类似锁投票、定时锁等候和可中断锁等候的一些特性。此外,它还提供了在激烈争用情况下更佳的性能。(换句话说,当许多线程都想访问共享资源时,JVM 可以花更少的时候来调度线程,把更多时间用在执行线程上。)

  reentrant锁意味着什么呢?简单来说,它有一个与锁相关的获取计数器,如果拥有锁的某个线程再次得到锁,那么获取计数器就加1,然后锁需要被释放两次才能获得真正释放。这模仿了synchronized的语义;如果线程进入由线程已经拥有的监控器保护的 synchronized 块,就允许线程继续进行,当线程退出第二个(或者后续)synchronized块的时候,不释放锁,只有线程退出它进入的监控器保护的第一个synchronized块时,才释放锁。

  在查看清单 1 中的代码示例时,可以看到Lock和 synchronized 有一点明显的区别 —— lock 必须在 finally 块中释放。否则,如果受保护的代码将抛出异常,锁就有可能永远得不到释放!这一点区别看起来可能没什么,但是实际上,它极为重要。忘记在 finally 块中释放锁,可能会在程序中留下一个定时炸弹,当有一天炸弹爆炸时,您要花费很大力气才有找到源头在哪。而使用同步,JVM 将确保锁会获得自动释放。

  除此之外,与目前的 synchronized 实现相比,争用下的ReentrantLock实现更具可伸缩性。(在未来的 JVM 版本中,synchronized 的争用性能很有可能会获得提高。)这意味着当许多线程都在争用同一个锁时,使用ReentrantLock的总体开支通常要比synchronized少得多。

  Tim Peierls 用一个简单的线性全等伪随机数生成器(PRNG)构建了一个简单的评测,用它来测量synchronized和Lock之间相对的可伸缩性。这个示例很好,因为每次调用nextRandom()时,PRNG 都确实在做一些工作,所以这个基准程序实际上是在测量一个合理的、真实的synchronized和Lock应用程序,而不是测试纯粹纸上谈兵或者什么也不做的代码(就像许多所谓的基准程序一样。)

  在这个基准程序中,有一个PseudoRandom的接口,它只有一个方法nextRandom(int bound)。该接口与java.util.Random类的功能非常类似。因为在生成下一个随机数时,PRNG 用最新生成的数字作为输入,而且把最后生成的数字作为一个实例变量来维护,其重点在于让更新这个状态的代码段不被其他线程抢占,所以我要用某种形式的锁定来确保这一点。(java.util.Random类也可以做到这点。)我们为PseudoRandom构建了两个实现;一个使用 syncronized,另一个使用java.util.concurrent.ReentrantLock。驱动程序生成了大量线程,每个线程都疯狂地争夺时间片,然后计算不同版本每秒能执行多少轮。图 1 和 图 2 总结了不同线程数量的结果。这个评测并不完美,而且只在两个系统上运行了(一个是双 Xeon 运行超线程 Linux,另一个是单处理器 Windows 系统),但是,应当足以表现synchronized与ReentrantLock相比所具有的伸缩性优势了。

  图 1 和图 2 中的图表以每秒调用数为单位显示了吞吐率,把不同的实现调整到 1 线程synchronized的情况。每个实现都相对迅速地集中在某个稳定状态的吞吐率上,该状态通常要求处理器得到充分利用,把大多数的处理器时间都花在处理实际工作(计算机随机数)上,只有小部分时间花在了线程调度开支上。您会注意到,synchronized 版本在处理任何类型的争用时,表现都相当差,而Lock版本在调度的开支上花的时间相当少,从而为更高的吞吐率留下空间,实现了更有效的 CPU 利用。

  根类Object包含某些特殊的方法,用来在线程的wait()、notify()和notifyAll()之间进行通信。这些是高级的并发性特性,许多开发人员从来没有用过它们 —— 这可能是件好事,因为它们相当微妙,很容易使用不当。幸运的是,随着 JDK 5.0 中引入,开发人员几乎更加没有什么地方需要使用这些方法了。

  通知与锁定之间有一个交互 —— 为了在对象上wait或notify,您必须持有该对象的锁。就像Lock是同步的概括一样,Lock框架包含了对wait和notify的概括,这个概括叫作条件(Condition)。Lock对象则充当绑定到这个锁的条件变量的工厂对象,与标准的wait和notify方法不同,对于指定的Lock,可以有不止一个条件变量与它关联。这样就简化了许多并发算法的开发。例如,条件(Condition)的 Javadoc 显示了一个有界缓冲区实现的示例,该示例使用了两个条件变量,“not full”和“not empty”,它比每个 lock 只用一个 wait 设置的实现方式可读性要好一些(而且更有效)。Condition的方法与wait、notify和notifyAll方法类似,分别命名为await、signal和signalAll,因为它们不能覆盖Object上的对应方法。

  如果查看 Javadoc,您会看到,ReentrantLock构造器的一个参数是 boolean 值,它允许您选择想要一个公平(fair)锁,还是一个不公平(unfair)锁。公平锁使线程按照请求锁的顺序依次获得锁;而不公平锁则允许讨价还价,在这种情况下,线程有时可以比先请求锁的其他线程先得到锁。

  为什么我们不让所有的锁都公平呢?毕竟,公平是好事,不公平是不好的,不是吗?(当孩子们想要一个决定时,总会叫嚷“这不公平”。我们认为公平非常重要,孩子们也知道。)在现实中,公平保证了锁是非常健壮的锁,有很大的性能成本。要确保公平所需要的记帐(bookkeeping)和同步,就意味着被争夺的公平锁要比不公平锁的吞吐率更低。作为默认设置,应当把公平设置为false,除非公平对您的算法至关重要,需要严格按照线程排队的顺序对其进行服务。

  那么同步又如何呢?内置的监控器锁是公平的吗?答案令许多人感到大吃一惊,它们是不公平的,而且永远都是不公平的。但是没有人抱怨过线程饥渴,因为 JVM 保证了所有线程最终都会得到它们所等候的锁。确保统计上的公平性,对多数情况来说,这就已经足够了,而这花费的成本则要比绝对的公平保证的低得多。所以,默认情况下ReentrantLock是“不公平”的,这一事实只是把同步中一直是事件的东西表面化而已。如果您在同步的时候并不介意这一点,那么在ReentrantLock时也不必为它担心。

  图 3 和图 4 包含与 图 1和 图 2 相同的数据,只是添加了一个数据集,用来进行随机数基准检测,这次检测使用了公平锁,而不是默认的协商锁。正如您能看到的,公平是有代价的。如果您需要公平,就必须付出代价,但是请不要把它作为您的默认选择。

  看起来ReentrantLock无论在哪方面都比synchronized好 —— 所有synchronized能做的,它都能做,它拥有与synchronized相同的内存和并发性语义,还拥有synchronized所没有的特性,在负荷下还拥有更好的性能。那么,我们是不是应当忘记synchronized,不再把它当作已经已经得到优化的好主意呢?或者甚至用ReentrantLock重写我们现有的synchronized代码?实际上,几本 Java 编程方面介绍性的书籍在它们多线程的章节中就采用了这种方法,完全用Lock来做示例,只把 synchronized 当作历史。但我觉得这是把好事做得太过了。

  虽然ReentrantLock是个非常动人的实现,相对 synchronized 来说,它有一些重要的优势,但是我认为急于把 synchronized 视若敝屣,绝对是个严重的错误。中的锁定类是用于高级用户和高级情况的工具。一般来说,除非您对Lock的某个高级特性有明确的需要,或者有明确的证据(而不是仅仅是怀疑)表明在特定情况下,同步已经成为可伸缩性的瓶颈,否则还是应当继续使用 synchronized。

  为什么我在一个显然“更好的”实现的使用上主张保守呢?因为对于java.util.concurrent.lock中的锁定类来说,synchronized 仍然有一些优势。比如,在使用 synchronized 的时候,不能忘记释放锁;在退出synchronized块时,JVM 会为您做这件事。您很容易忘记用finally块释放锁,这对程序非常有害。您的程序能够通过测试,但会在实际工作中出现死锁,那时会很难指出原因(这也是为什么根本不让初级开发人员使用Lock的一个好理由。)

  另一个原因是因为,当 JVM 用 synchronized 管理锁定请求和释放时,JVM 在生成线程转储时能够包括锁定信息。这些对调试非常有价值,因为它们能标识死锁或者其他异常行为的来源。Lock类只是普通的类,JVM 不知道具体哪个线程拥有Lock对象。而且,几乎每个开发人员都熟悉 synchronized,它可以在 JVM 的所有版本中工作。在 JDK 5.0 成为标准(从现在开始可能需要两年)之前,使用Lock类将意味着要利用的特性不是每个 JVM 都有的,而且不是每个开发人员都熟悉的。

  既然如此,我们什么时候才应该使用ReentrantLock呢?答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。ReentrantLock还具有可伸缩性的好处,应当在高度争用的情况下使用它,但是请记住,大多数 synchronized 块几乎从来没有出现过争用,所以可以把高度争用放在一边。我建议用 synchronized 开发,直到确实证明 synchronized 不合适,而不要仅仅是假设如果使用ReentrantLock“性能会更好”。请记住,这些是供高级用户使用的高级工具。(而且,真正的高级用户喜欢选择能够找到的最简单工具,直到他们认为简单的工具不适用为止。)。一如既往,首先要把事情做好,然后再考虑是不是有必要做得更快。

  Lock框架是同步的兼容替代品,它提供了synchronized没有提供的许多特性,它的实现在争用下提供了更好的性能。但是,这些明显存在的好处,还不足以成为用ReentrantLock代替synchronized的理由。相反,应当根据您是否需要ReentrantLock的能力来作出选择。大多数情况下,您不应当选择它 —— synchronized 工作得很好,可以在所有 JVM 上工作,更多的开发人员了解它,而且不太容易出错。只有在真正需要Lock的时候才用它。在这些情况下,您会很高兴拥有这款工具。

  阅读本文,使我从对比的角度重新审视了两种锁的机制。分享一下下O(∩_∩)O 原文出处: 博文来自:xianqi_h的专栏

  java在编写多线程程序时,为了保证线程安全,需要同步,经常用到两种同步方式就是Synchronized和重入锁ReentrantLock。相似点:这两种同步方式有很多相似之处,它们都是加锁方式同步,...博文来自:记忆力不好的博客

  图1和图2中的图表以每秒调用数为单位显示了吞吐率,把不同的实现调整到1线程synchronized的情况。每个实现都相对迅速地集中在某个稳定状态的吞吐率上,该状态通常要求处理器得到充分利用,把大多数的...博文来自:abwbw的博客

  首先说明可重入锁的概念,即一个线程尝试去获取自己已经持有的锁,可以成功获取,而其他线程不可以获取。这样做的优点简而言之是——递归无阻塞的同步机制。若锁不是可重入的,在子类的同步方法中调用父类的同步方法...博文来自:lxs1995的博客

  对于Synchronized、ReentrantLock、Atomic、CAS在并发下面的性能比较,在JDK1.6和JDK1.8下面测试通过。我们考虑一个最简单的并发场景,对对象自增字段在并发下面的处...博文来自:Meiyang1990的博客

  多线程和并发性并不是什么新内容,但是Java语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个 Thread 类,可以用它来构建、启动和操...博文来自:ice563102472的专栏

  转载代码块声明为synchronized,后果:1.原子性(atomicity)2.可见性(visibility)可见性则更为微妙;它要对付内存缓存和编译器优化的各种反常行为...博文来自:imduan的博客

  原文:多线程和并发性并不是什么新内容,但是Java语言设计中的创新之一就是...博文来自:yue0706的博客

  多线程和并发性并不是什么新内容,但是Java语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个 Thread 类,可以用它来构建、启动和操...博文来自:u011746030的专栏

  原文:多线程和并发性并不是什么新内容,但是 Java 语言设计中的创新之一...博文来自:changwilling的博客

  锁的实现Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现。可重入性,两者都是同一个线程每进入一次,锁的计数器自增1,所以要等到锁的计数器下降为0时才能释放锁。功能...博文来自:闪电式旋风的博客

  JDK5.0为开发人员开发高性能的并发应用程序提供了一些很有效的新选择,目前存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,ReentrantLock是...博文来自:Mr_Smile2014的博客

  原文地址:一个关于打水的小故...博文来自:BlackPlus28的博客

  这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍。相似点:这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同...博文来自:zxd8080666的博客

  参考在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨...博文来自:zehuawong的博客

  前言相信学过java的人都知道synchronized这个关键词,也知道它用于控制多线程对并发资源的安全访问,兴许,你还用过Lock相关的功能,但你可能从来没有想过java中的锁底层的机制是怎么实现的...博文来自:yanyan19880509的专栏

  ReenTrantLock可重入锁(和synchronized的区别)总结可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可...博文来自:的博客

  多线程和并发性并不是什么新内容,但是Java语言设计中的创新之一就是,它是第一个直接把跨平台线程模型和正规的内存模型集成到语言中的主流语言。核心类库包含一个 Thread 类,可以用它来构建、启动和操...博文来自:sinat_32137099的博客

  前言其实标题使用互斥机制更合适,并发中主要两个问题是:线程如何同步以及线程如何通信。同步主要是通过互斥机制保证的,而互斥机制我们最熟悉的就是锁,当然也有无锁的CAS实现。多线程共享资源,比如一个对象的...博文来自:张硕的博客

  在并发环境下,解决共享资源冲突问题时,可以考虑使用锁机制。1.对象锁所有对象都自动含有单一的锁。JVM负责跟踪对象被加锁的次数。如果一个对象被解锁,其计数变为0。在任务(线程)第一次给对象加锁的时候,...博文来自:hugh 的博客

  重入锁reentrantlock可以选择公平锁和非公平锁。内部锁synchronized本身是非公平锁。从性能的角度上看,非公平锁性能要远大于公平锁。至于重入锁中非公平锁的性能和内部锁synchron...博文来自:fofabu2的博客

  java中的锁的种类很多。目前对这部分知识点只是停留在了解的基础上,就目前知识进行梳理,并长期补充。java中锁常用的为synchronized和current.Lock下的...博文来自:weixin_38035852的博客

  同步代码块,同步方法,或者是用java提供的锁机制,我们可以实现对共享资源变量的同步控制。技术点:1、线程与进程:在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个...博文来自:琦彦

  一。为何使用分布式锁?当应用服务器数量超过1台,对相同数据的访问可能造成访问冲突(特别是写冲突)。单纯使用关系数据库比如MYSQL的应用可以借助于事务来实现锁,也可以使用版本号等实现乐观锁,最大的缺陷...博文来自:z69183787的专栏

  声明:从网上找的资料,感觉写的特别牛掰的好东西,和大家分享一下。打个比方:一个object就像一个大房子,大门永远打开。房子里有很多房间(也就是方法)。这些房间有上锁的(synchronized方法)...博文来自:仰视未来的专栏

  原文:多线程和并发性并不是什么新内容,但是Java语言设计中的创新之一就是...博文来自:xiangzhihong8的专栏

  因为synchronized是关键字,无法看到源代码,所以只能做一个简单的分析对比了,synchronized能锁方法,也能锁代码块,其实也是一种重入锁(也就是自己的锁,自己可以进去),代码块或方法离...博文来自:chenfenggang的专栏

  以下内容摘自我的Gitchat:Java程序员必备:并发知识系统总结,欢迎订阅!Github地址:博文来自:不忘初心

  AQS的功能可以分为独占和共享,ReentrantLock实现了独占功能。ReentrantLock实现了Lock接口,加锁和解锁都需要显式写出,注意一定要在适当时候unlock。  Reentran...博文来自:world6的博客

  一、先整体了解一下重入锁ReentrantLock的大体思路?先通过一张图,了解一下ReentrantLock的关系网(就好比看一个人NB不NB得先看他周围的人和家里的亲戚够不够NB,现在就开始看看R...博文来自:王伟的博客

  目录synchronized和ReentrantLock有什么区别?有人说synchronized最慢,这线注意事项考点分析知识扩展首先,我们需要理解什么是线程安...博文来自:的博客

  一、Lock接口在上一篇文章中:Java多线)-使用Lock对象实现同步以及线程间通信介绍了如何使用Lock实现和synchronized关键字类似的同步功能,只是Lock在使用时需要显式...博文来自:徐刘根的博客

  Synchronized:Synchronized修饰的代码块或者方法被某个线程获取到之后,其他线程就会被阻塞。当被修饰的方法执行完后则自动释放锁Lock:Lock是一个接口,lock提供比Synch...博文来自:345丶

  我们在面试的时候,时常被问到如何保证线程同步已经对共享资源的多线程编程。我们当然用同步代码块,同步方法,又或者是用java提供的锁机制来达到对共享资源变量的同步控制。那么我们什么时候用synchron...博文来自:Seeker-Wu的专栏

  IAP升级功能编写初期的一些困惑与疑问---完成功能后的总结 一,网上下载的例程,跳转部分的代码有差异,尤其是用的汇编那句 二,关于跳转部分的代码的理解(转) 三,关于跳转时能否不用按键,用软件标志位...博文来自:Super_Demo的专栏

  一、前言最近由于研究需要,要用到线性判别分析(LDA)。于是找了很多资料来看,结果发现大部分讲的都是理论知识,因此最后还是看的一知半解,后来终于找到了个英文的文档,作者由PCA引入LDA,看过后豁然开...博文来自:jnulzl的专栏

  输出数据分割 默认情况下Streaming框架将map输出的每一行第一个”\t”之前的部分作为key,之后的部分作为value,key\tvalue又作为reduce的输入。可以用-D stre...博文来自:enockipp的小码头

  1、错误:                 键盘遮挡输入框最常见的可能就是在登录界面了,无论有多少个textFiled,不论是在VC的任何位置。都有可能造成键盘弹出来时,把输入框挡住了。...博文来自:AppleWiner的博客

  本篇文章是根据我的上篇博客,给出的改进版,由于时间有限,仅做了一个简单的优化。相关文章:将excel导入数据库2018年4月1日,新增下载地址链接:点击打开源码下载地址十分抱歉,这个链接地址没有在这篇...博文来自:Lynn_Blog

  定义 数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之...博文来自:yehui_qy的博客

  作者fbysss声明:本文由fbysss原创,转载请注明出处关键字:tomcat监控...博文来自:fbysss的专栏

  DirectX修复工具API Sets强力修复实验包下载地址: 密码:5y5v 实验包使用说明...博文来自:VBcom的专栏

  上一篇文章说了python如何解析excel文件博文来自:waylyn_wu的专栏

  扫二维码关注,获取更多技术分享 本文承接之前发布的博客《 微信支付V3微信公众号支付PHP教程/thinkPHP5公众号支付》必须阅读上篇文章后才可以阅读这篇文章。由于最近一段时间工作比较忙,...博文来自:Marswill

  Java中的ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的Thread...博文来自:u011860731的专栏

  今天在学习Afinal框架时,无意中看到了GitHub上的xUtils开源项目源码,对Afinal进行了大量重构,功能上也比Afinal更加强大,为方便学习,特将xUtils项目源码的使用方法转载至此...博文来自:云淡风轻的博客

  强连通分量: 简言之 就是找环(每条边只走一次,两两可达) 孤立的一个点也是一个连通分量   使用tarjan算法 在嵌套的多个环中优先得到最大环( 最小环就是每个孤立点)   定义: int Ti...博文来自:九野的博客

  我们可能经常会用到这一功能,比如有时,我们不希望用户没有进行登录访问后台的操作页面,而且这样的非法访问会让系统极为的不安全,所以我们常常需要进行登录才授权访问其它页面,否则只会出现登录页面,当然我的思...博文来自:沉默的鲨鱼的专栏

  jquery/js实现一个网页同时调用多个倒计时(最新的) 最近需要网页添加多个倒计时. 查阅网络,基本上都是千遍一律的不好用. 自己按需写了个.希望对大家有用. 有用请赞一个哦! //js ...博文来自:Websites

  摘要:为了协助处理器完成初始化和控制系统操作,80x86提供了一个标志寄存器和几个系统寄存器。Eflags用于控制任务切换、中断处理、指令跟踪和权限访问。系统寄存器用于内存管理和控制处理器操作。 1...博文来自:河西无名式

  自己整理编写的逻辑回归模板,作为学习笔记记录分享。数据集用的是14个自变量Xi,一个因变量Y的australian数据集。 1. 测试集和训练集3、7分组 australian ...博文来自:Tiaaaaa的博客

http://attaribros.com/zhengyongtiaojian/102.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有