在本地与远程分别新建了一个仓库并且关联后,想要把本地的文件提交到github上面,

输入下方命令后没有成功,而是出现了报错:error: src refspec master does not match any

git push -u origin master

原因,此时提交所在的分支是一个空目录,没有任何内容所以无法完成提交,所以应该先将待提交的内容添加到仓库并且提交以后再推到远程仓库,即

git add .
git commit -m "XXX"
git push -u origin master

什么是原子类,有什么作用?

不可分割性,一个操作是不可中断的,即便是多线程的情况下也可以保证。Java当中java.util.concurrent.atomic包下的都是具有原子特性的类。

原子类的作用和锁是类似的,都是为了保证并发情况下线程安全。不过原子类相比于锁,有一定的优势

  • 锁粒度更细:原子变量可以把竞争范围缩小到变量级别,这是我们可以获得的最细粒度的情况了,通常锁的粒度都要大于原子变量的粒度。锁的粒度小就不会锁住无用代码,可以提高并发效率。

  • 效率更高:通常,使用原子类的效率会比使用锁的效率更高,除非是高度竞争的情况下。所以需要根据场景进行选择。

6类原子类纵览

  • Atomic*基本类型原子类

    AtomicInteger、AtomicLong、AtomicBoolean

  • Atomic*Array数组类型原子类

    AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray

  • Atomic*Reference引用类型原子类

    AtomicReference、AtomicStampedReference、AtomicMarkableReference

  • Atomic*FieldUpdater升级类型原子类

    可以把一个不具备原子性的普通变量升级为原子性的。

    AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater

  • Adder累加器

    累加效果很好

    LongAdder、DoubleAdder

  • Accumulator累加器

    在Adder上又增加了一些额外的功能,只是用到的并不多。

    LongAccumulator、DoubleAccumulator

Atomic*基本类型原子类 ,以AtomicInteger为例

其实是对int或者Integer类型的一个封装,封装以后提供了原子的访问和更新操作,原理是基于CAS算法

常用方法:

public final int get()//获取当前值
public final int getAndSet(int newValue)//获取当前值并设置新的值
public final int getAndIncrement()//获取当前值并自增
public final int getAndDecrement()//获取当前值并自减
public final int getAndAdd(int delta)//获取当前值,并且加上预期的值
public final boolean compareAndSet(int expectedValue, int newValue) //如果当前的数值等于预期值,就以原子方式将这个值设置为新值(newValue),否则就不操作

AtomicArray数组类型原子类

Atomic*Reference引用类型原子类

AtomicReference:AtomicReference类的作用,和AtomicInteger并没有本质区别,AtomicInteger可以让一个整数保证原子性,而AtomicInteger可以让一个对象保证原子性,当然,AtomicReference的功能明显比AtomicInteger强,因为一个对象里可以包含很多属性。用法和AtomicInteger类似。

AtomicReference在自旋锁的应用:

public class AtomicReference<V> implements java.io.Serializable {
   private static final VarHandle VALUE;
   //省略
   public final boolean compareAndSet(V expectedValue, V newValue) {
       return VALUE.compareAndSet(this, expectedValue, newValue);
  }
}

public abstract class VarHandle {
   public final native
   @MethodHandle.PolymorphicSignature
   @HotSpotIntrinsicCandidate
   boolean compareAndSet(Object... args);
}

把普通变量升级为原子类:用AtomicIntegerFieldUpdater升级原有变量

辅助自己的一个普通变量,让他也能够具有原子性。

使用场景:当我们大多数情况下需要的是一个普通类型,只有少数情况下,偶尔需要一个原子get-set操作。毕竟原子的消耗还是比普通类型要大的。

关于这个工具的使用:

public class Candidate {
   volatile int score;
}
AtomicIntegerFieldUpdater<Candidate> scoreUpdater = AtomicIntegerFieldUpdater
          .newUpdater(Candidate.class, "score");//传入对应的类名和要升级的变量名
scoreUpdater.getAndIncrement(tom);//进行相应的原子操作,例如自增

AtomicIntegerFieldUpdater注意点:

  • 可见范围

    背后的原理利用了反射,被升级的变量需要具有可见性,而如果是被private修饰,这个操作就不能成功。

  • 不支持static

    被升级变量不支持被static修饰,否则会报IllegalArgumentException异常。

Adder累加器

Adder累加器是在Java8引入的,相对而言是个较新的类。高并发下LongAdder比AtomicLong效率高,不过本质是空间换时间。竞争激烈的时候,LongAdder把不同线程对应到不同的Cell(一个内部结构)上进行修改,降低冲突的概率,是多段锁的理念,提高了并发性。

  • 使用效果:假如说多线程情况下AtomicLong被多个线程累加,每一次加法,都要flush和refresh,很耗费资源。因为在AtomicLong当中为了保持多核之间的数据一致性,每次操作完会把数据刷回主内存,同样每次由从主内存中读取,进行一个间接通信,所以会慢一些。 在内部,LongAdder的实现原理和AtomicLong是不同的,AtomicLong每一次加法都需要做同步,所以在高并发的时候导致冲突比较多,也就降低了效率。而LongAdder,每个线程都会有一个自己的计数器,仅仅用来在自己的线程中计数,这样一来就不会被其他线程的计数器干扰,不同线程的操作之间不存在竞争关系,所以在加和的过程中,根本不需要同步机制,也不需要flush和refresh,没有一个统一的counter来给所有线程统一计数。

  • LongAdder的改进原理:

    LongAdder引入了分段累加的概念,内部有一个base变量和一个Cell[]数组共同参与计数,竞争不激烈时,直接累加到base变量上;竞争激烈时,各个线程分散累加到自己的槽Cell[i]中,通过计算哈希值给每个线程分配不同的Cell,每个Cell都是一个独立的计数器,这样就不会和其他线程产生干扰了,Cell之间也不存在任何的竞争关系,所以操作中就大大降低了flush和refresh操作,这就是LongAdder吞吐量大的原因,空间换时间。

    参考文章:LongAdder解析

  • 适用场景:

    在低争用情况下,AtomicLong和LongAdder两个类具有类似的特征。但是在竞争激烈的情况下,LongAdder的预期吞吐量要高得多,但是同时也消耗更多空间。LongAdder适合的场景是统计求和和计数的场景,而且LongAdder基本只提供了add方法,而AtomicLong还具有cas方法。

Accumulator累加器

Accumulator和Adder非常相似,Accumulator就是一个更通用版本的Adder。

 

Git提交出现error: src refspec master does not match any的问题的更多相关文章

  1. Git:错误:error:src refspec master does not match any

    新建立了一个远程仓库,想着把项目放上去.于是在项目目录上: git init 然后就添加远程库 git remote add origin xxxx.git 然后就想push: git push -u ...

  2. GIT问题,error:src refspec master does not match any

    将本地GIT版本库PUSH到一个GITHUB上一个空的版本库时可能会出现如下错误error:src refspec master does not match any原因: 本地版本库为空, 空目录不 ...

  3. git push 失败出现error: src refspec master does not match any.解决方案

    今天写好一个demo往GitHub上传时报错 错误提示: error: src refspec master does not match any. error: failed to push som ...

  4. git push 时发生错误 error: src refspec master does not match any. error: failed to push some refs to

    很多相关解决办法都是最后要 push 到远端的 master 上,但很多其实要求不能把个人的修改内容直接 push 到 master 主分支. 因此,当我想将本地 feature/work1 分支的修 ...

  5. github上传时出现error: src refspec master does not match any解决办法

    github上传时出现error: src refspec master does not match any解决办法 这个问题,我之前也遇到过,这次又遇到了只是时间间隔比较长了,为了防止以后再遇到类 ...

  6. error: src refspec master does not match any. 错误处理办法

    自从上次学了git之后,很少用.今天在使用 本地仓库使用如下命令初始化: $ git init 之后使用如下命令添加远程库: $ git remote add origin git@github.co ...

  7. github上传时出现error: src refspec master does not match any解决办法22

    1 error:src refspec master does not match any这个问题,我之前也遇到过,这次又遇到了只是时间间隔比较长了,为了防止以后再遇到类似问题,还是把这个方法简单记录 ...

  8. error: src refspec master does not match any.

    执行下面的命令,git push 时候出错: git push origin master 出现如下错误: error: src refspec master does not match any. ...

  9. 使用 Git 报错 error: src refspec master matches more than one.

    今天在使用 Git push 代码时遇到一个报错: error: src refspec master matches more than one. error: failed to push som ...

随机推荐

  1. Oracle10g下载地址

    Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit ...

  2. 以及Hibernate和Mybatis区别

    ORM框架? Object Relational Mapping,对象-关系映射. 项目中的业务实体有两种表现形式:对象和关系数据,即在内存中表现为对象,在数据库中表现为关系数据. 为什么需要ORM框 ...

  3. 用javaweb写一个注册界面,并将数据保存到后台数据库(全部完成)(课堂测试)

    一.题目:WEB界面链接数据库 1.考试要求: 1登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头:(1分) 2登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母. ...

  4. php 等于不等于 一个感叹号两个等于号

    $a == $b 等于 TRUE,如果 $a 等于 $b. $a === $b 全等 TRUE,如果 $a 等于 $b,并且它们的类型也相同.(PHP 4 引进) $a != $b 不等 TRUE,如 ...

  5. 导弹拦截p1020(LIS问题)

    题目描述(题目链接:https://www.luogu.org/problem/P1020) 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够 ...

  6. 1-8SpringBoot之切面AOP

    SpringBoot提供了强大AOP支持,我们前面讲解过AOP面向切面,所以这里具体AOP原理就补具体介绍: AOP切面主要是切方法,我们一般搞一些日志分析和事务操作,要用到切面,类似拦截器: @As ...

  7. Vue + Webpack 根据不同环境打包

    修改 prod.env.js // 当前正在运行的脚本名称 const TARGET = process.env.npm_lifecycle_event // 第一个参数 let argv = pro ...

  8. java环境变量修改后不生效

    修改java环境变量后,cmd查看java版本,还是之前的版本,需要做以下处理: 1. 删除C:\Windows\System32目录下的相关的java.exe.javaw.exe.javaws.ex ...

  9. CSP-J/S2019试题选做

    S D1T2 括号树 设\(f[u]\)表示根到\(u\)的路径上有多少子串是合法括号串.(即题目里的\(k_u\),此变量名缺乏个性,故换之) 从根向每个节点dfs,容易求出\(c[u]\):表示从 ...

  10. metasploit扫描

    实验目的: 一.  基于TCP协议收集主机信息 二.  基于SNMP协议收集主机信息 三.  基于SMB协议收集信息 四.  基于SSH协议收集信息 五.  基于FTP协议收集信息     实验环境: ...