360系的软件是国内用户群最大的PC端电脑软件,包括360安全卫士、360杀毒、360浏览器等,都是国内数一数二的常用软件,在这里一键下载,岂不快哉!

老规矩,你选择再安装,不捆绑,不刷流氓。

一键装机,快捷方便,请在电脑端下载 http://urlqh.cn/mNX1O

7次点赞
105次阅读
2345纯净版是上市公司2345官方发布的软件包,是为了提升用户体验,全新上线的一款纯净无广告一键安装包。 集成了2345网址导航、2345加速浏览器(纯净版)、2345安全卫士(纯净版)、2345输入法(纯净版)、腾讯电脑管家、2345看图王(纯净版)、酷我音乐、爱奇艺等9款最常用的产品。所有软件可以根据您的需求,自由勾选,一键安装!【注:本次发布的官方的纯净版,良心之作,安装不弹窗无广告,以后升级不弹窗无广告,强烈推荐】
1次点赞
60次阅读
语言 【开源资讯】Rust 1.43.0 发布 2020-04-27 17:25:57 发布

Rust 是 Mozilla 的一个新的编程语言,由web语言的领军人物Brendan Eich(js之父),Dave Herman以及Mozilla公司的Graydon Hoare 合力开发。

【开源资讯】Rust 1.43.0 发布

创建这个新语言的目的是为了解决一个很顽疾的问题:软件的演进速度大大低于硬件的演进,软件在语言级别上无法真正利用多核计算带来的性能提升。Rust是针对多核体系提出的语言,并且吸收一些其他动态语言的重要特性,比如不需要管理内存,比如不会出现Null指针等等。

Rust 1.43.0 现已发布。这是一个相当小的版本,没有新的主要功能,提供了一些新的稳定的 API、一些编译器的性能改进以及与宏相关的小功能。一些具体更新内容如下:

在宏中,可以使用item片段将项目插值到特征、impls 和 extern blocks 的主体中。例如:

macro_rules! mac_trait {
   ($i:item) => {
       trait T { $i }
   }
}
mac_trait! {
   fn foo() {}
}

这将产生:

trait T {
   fn foo() {}
}

围绕原语,引用和二进制操作的类型推断得到了改进。代码示例使这一点更容易理解:该代码无法在 Rust 1.42 上编译,但是可以在 Rust 1.43 上编译。

let n: f32 = 0.0 + &0.0;

在 Rust 1.42 中,用户会得到一个错误,提示“ hey, I don't know how to add an f64 and an &f64 with a result of f32 “。现在,该算法正确地确定了0.0和&0.0应该f32改为。

为了帮助进行集成测试,Cargo 将设置一些新的环境变量。

Library changes

现在,用户可以直接在 floats 和 integers 上使用关联的常量,而不必导入模块。

有一个新primitive 模块可以重新导出 Rust 的原始类型。当用户编写宏并要确保类型不被遮盖时,这可能很有用。

此外,还稳定了六个新的 API:

  • Once::is_completed

  • f32::LOG10_2

  • f32::LOG2_10

  • f64::LOG10_2

  • f64::LOG2_10

  • iter::once_with

以及一些其他变化,更多详情可查看发布说明:https://blog.rust-lang.org/2020/04/23/Rust-1.43.0.html

0次点赞
38次阅读
百度 百度HI正式更名为“如流” 2020-04-27 17:17:00 发布

PingWest品玩4月27日讯,百度HI昨天正式发布公告,称即日起品牌升级,百度HI正式更名为“如流”。

百度HI是百度在2008年推出的一款即使通讯软件,包括文字信息、文件传输、语音视频等多个功能。品牌升级之后,现有功能和服务不会改变,用户仍然可以使用现有账号登陆。同时,还会增加多达520人的音视频会议、自动翻译等办公服务,方便用户使用。

百度HI正式更名为“如流”

2次点赞
119次阅读

我们使用Python语言开发,可能是测试用例,也可能是人工智能,也可能是大数据处理,还有可能是常规的Web开发或者后台接口,都是可以的,然而,我们总是需要一个好的工具才能开始。首选工具当然是JetBrains的PyCharm。

PyCharm是由JetBrains打造的一款Python IDE。PyCharm具备一般IDE的功能,比如, 调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制……
另外,PyCharm还提供了一些很好的功能用于Django开发,同时支持Google App Engine,更酷的是,PyCharm支持IronPython!

特性:

  1. 智能编辑:为Python提供代码完成,快速切换语法,错误代码高亮显示和代码检查;
  2. 代码重构:包括重命名,引入变量,不断引进,拉,推下来,其他人;
  3. 使用Django进行Web开发:支持特定的模板编辑,服务器从IDE的启动,对HTML,CSS和JavaScript编辑的支持;
  4. 项目和代码导航:项目查看,文件结构查看,在文件,类,方法间快速跳转;
  5. Error-Free编码:快速进行代码分析,错误高亮显示和快速修复;
  6. 集成VCS:支持Subversion, Perforce, Git以及CVS 等;
  7. 跨平台:支持Windows,Mac OS X和Linux操作系统

这么好的工具,当然要去官方网站https://www.jetbrains.com/下载。我出于学习研究的目的,找到了一个可以暂时不用花钱的方法研究的patch,而且本站也不是用Python开发的,我也没有将其商用。

所以大家放心好了。按惯例,推荐大家若资金允许,请点击链接购买正版。若大家想研究研究如何使用,可以在本站寻找QQ群,进来一起分析研究一下,互相交流学习。

0次点赞
115次阅读

CAS:Compare And Swap(字面意思是比较与交换),JUC包中大量使用到了CAS,比如我们的atomic包下的原子类就是基于CAS来实现。区别于悲观锁synchronized,CAS是乐观锁的一种实现,在某些场合使用它可以提高我们的并发性能。

在CAS中,主要是涉及到三个操作数,所期盼的旧值、当前工作内存中的值、要更新的值,仅当所期盼的旧值等于当前值时,才会去更新新值。

比如当如下场景,由于i++是个复合操作,读取、自增、赋值三步操作,因此在多线程条件下我们需要保证i++操作的安全

 

public class CASTest {    int i = 0;    public void increment() {
i++;
}
}

 

解决办法有通过使用synchronized来解决,synchronized解决了并发编程的原子性,可见性,有序性。

 

public class CASTest {    int i = 0;    public synchronized  void increment() {
i++;
}
}

 

但synchronized毕竟是悲观锁,尽管它后续进行了若干优化,引入了锁的膨胀升级措施,但是还是存在膨胀为重量级锁而导致阻塞问题,因此,我们可以使用基于CAS实现的原子类AtomicInteger来保证其原子性

 

public class CASTest {
AtomicInteger i = new AtomicInteger(0); public static void increment() { //自增并返回新值 i.incrementAndGet();
}
}

 

atomic包下的原子类就是基于CAS实现的,我们拿AtomicInteger来分析下CAS.

 

public class AtomicInteger extends Number implements java.io.Serializable {    private static final long serialVersionUID = 6214790243416807050L;    // CAS操作是基于一个Unsafe类,Unsafe类是整个Concurrent包的基础,里面所有的函数都是native的
private static final Unsafe unsafe = Unsafe.getUnsafe(); //内存偏移量
private static final long valueOffset; static { try { //初始化地址偏移量
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
} //底层采用volatile修饰值,保证其可见性和有序性
private volatile int value;

 

从AtomicInteger定义的相关属性来看,其内部的操作都是基于Unsafe类,因为在Java中,我们并不能直接操作内存,但是Java还是开放了一个Unsafe类来给我们进行操作,顾名思义,Unsafe,是不安全的,因此要谨慎使用。

其内部定义的值是用volatiel进行修饰的,volatile可以保证有序性和可见性,具体为什么可以保证就不在此阐述了。

再来看看其几个核心的API

 

//以原子方式将值设置为给定的新值 expect:期望值 update:旧值public final boolean compareAndSet(int expect, int update) {    return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}//以原子方式将当前值+1,返回期望值public final int incrementAndGet() { return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
}//以原子方式将当前值-1,返回期望值 public final int decrementAndGet() { return unsafe.getAndAddInt(this, valueOffset, -1) - 1;
}

 

关于其源码还是很少的,基本都是基于Unsafe类进行实现的。

先来看看compareAndSet方法,其调用的是Unsafe的compareAndSwapInt方法,当工作内存中的值与所期盼的旧值不相同的时候,会更新失败,举例说明:

 

public class CASDemo {    public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(2020);
System.out.println("更新结果:"+atomicInteger.compareAndSet(2020, 2021));
System.out.println("当前值为:"+atomicInteger.get()); //自增加一 atomicInteger.getAndIncrement();

System.out.println("更新结果:"+atomicInteger.compareAndSet(2020, 2021));
System.out.println("当前值为:"+atomicInteger.get());
}
}

 

 在来看看incrementAndGet方法,其调用的是unsafe.getAndAddInt方法,其就相当于是自旋锁的实现,当所期盼的旧值与新值相同时才更新成功,否则就进行自旋操作直到更新成功为止。

 

public final int getAndAddInt(Object var1, long var2, int var4) {    int var5;    do {
var5 = this.getIntVolatile(var1, var2);
} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4)); return var5;
}

 

CAS的优点很明显,基于乐观锁的思想,提高了并发情况下的性能,缺点主要是ABA问题、自旋时间过长导致CPU占有率过高、只能保证一个共享变量的原子性。

ABA问题

就是一个值由A变为B,在由B变为A,使用CAS操作无法感知到该种情况下出现的变化,带来的后果很严重,比如银行内部员工,从系统挪走一百万,之后还了回来,系统感知不到岂不是要出事。模拟下出现ABA问题:

 

   public class ABA {       private static AtomicInteger atomicInteger = new AtomicInteger(0);   
public static void main(String[] args) { //线程t1实现0->1->0
Thread t1 = new Thread(new Runnable() {
@Override public void run() {
atomicInteger.compareAndSet(0,1);
atomicInteger.compareAndSet(1,0);
}
},"t1");
//线程t2实现0->100
Thread t2 = new Thread(new Runnable() {
@Override public void run() { try { //模拟狸猫换太子行为
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("更新结果:"+atomicInteger.compareAndSet(0, 100));
}
});

t1.start();
t2.start();
}
}

 

运行结果是:true

解决ABA可以使每一次修改都带上时间戳,以记录版本号的形式来使的CAS感知到这种狸猫换太子的操作。Java提供了AtomicStampedReference类来解决,该类除了指定旧值与期盼值,还要指定旧的版本号与期盼的版本号

 

    public boolean compareAndSet(V   expectedReference, V   newReference, int expectedStamp, int newStamp) {
Pair<V> current = pair; return expectedReference == current.reference && expectedStamp == current.stamp && ((newReference == current.reference && newStamp ==current.stamp) || casPair(current, Pair.of(newReference, newStamp)));
}

 

 

public class ABA_Test {    // 初始值100,版本号1
private static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<Integer>(100, 1); public static void main(String[] args) throws InterruptedException { // AtomicStampedReference实现
Thread tsf1 = new Thread(new Runnable() {
@Override public void run() { try { // 让 tsf2先获取stamp,导致预期时间戳不一致
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
} // 预期引用:100,更新后的引用:110,预期标识getStamp() 更新后的标识getStamp() + 1
atomicStampedReference.compareAndSet(100, 110, atomicStampedReference.getStamp(),
atomicStampedReference.getStamp() + 1);
atomicStampedReference.compareAndSet(110, 100, atomicStampedReference.getStamp(),
atomicStampedReference.getStamp() + 1);
}
});

Thread tsf2 = new Thread(new Runnable() {
@Override public void run() { int stamp = atomicStampedReference.getStamp(); try {
TimeUnit.SECONDS.sleep(2); // 线程tsf1执行完
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println( "AtomicStampedReference:" + atomicStampedReference.compareAndSet(100, 120, stamp, stamp + 1));
}
});

tsf1.start();
tsf2.start();
}
}

 

运行结果:

自旋次数过长

 CAS是基于乐观锁的思想实现的,当频繁出现当前值与所旧预期值不相等的情况,会导致频繁的自旋而使得浪费CPU资源。

只能保证单个共享变量的原子性

单纯对共享变量进行CAS操作,只能保证单个,无法使多个共享变量同时进行原子操作。

0次点赞
23次阅读
Golang 2020 中国 Go 开发者调查报告 2020-04-22 14:19:49 发布
2020 年初,看过Go官方在过去一年里面的总结,GopherChina 也通过网络的方式对中国的 Go 开发者进行了一次深度调查。本次调查旨在关注 Go 在中国的最新趋势并总结 Go 开发的发展情况。
0次点赞
13次阅读
全站搜索
本站公告
  1. 现在是移动互联网的时代,人手一部手机,有鉴于此,本站新上线了Android频道,会不定时给大家推荐一些优秀好用的Android平台的APP,欢迎大家浏览。

站长推荐
特别推荐
技术支持
站外链接
统计信息
创立时间: 2017 年
发表文章: 312 篇
注册用户: 15643 人
昨天在线: 356 人
联系我们
QQ: 76935144
邮箱: 76935144@qq.com
QQ群: 413257672 QQ群