Java内存模型FAQ(六)没有正确同步的含义是什么?没有正确同步的代码对于不同的人来说可能会有不同的理解。在Java内存模型这个语义环境下,我们谈到“没有正确同步”,我们的意思是:
一个线程中有一个对变量的写操作,
另外一个线程对同一个变量有读操作,
而且写操作和读操作没有通过同步来保证顺序。
当这些规则被违反的时候,我们就说在这个变量上有一个“数据竞争”(data race)。一个有数据竞争的程序就是一个没有正确同步的程序。
main方法被声明为private会怎么样?IDE中运行,比如Eclipse中连Java Application按钮都没有,所以能通过编译但是不能运行,在命令行中运行应该是会提示main方法不是public.public static void main(String args[])这段声明里每个关键字的作用
public: main方法是Java程序运行时调用的第一个方法,因此它必须对Java环境可见。所以可见性设置为public.static: Java平台调用这个方法时不会创建这个类的一个实例,因此这个方法必须声明为static。void: main方法没有返回值。String是命令行传进参数的类型,args是指命令行传进的字符串数组。main方法的static修饰符会怎样?工作一年多了,似是而非的接触Java已经一年,每天忙于堆业务,改Bug,没时间去学习Java的基础知识,仅仅局限于会使用Java语言,这样子肯定是不行的。今天无意间看到一个Android开源Library,里面有这样一段代码:
public void notifyUpdateSkin(Object arg) {
    SkinObserver[] arrLocal;
    synchronized (this) {
        arrLocal = observers.toArray(new SkinObserver[observers.size()]);
    }
    for (int i = arrLocal.length-1; i>=0; i--)
        arrLocal[i].updateSkin(this, arg);
}
看了半天居然没看懂arrLocal = observers.toArray(new SkinObserver[observers.size()]);
这行代码,也就是没看懂toArray()方法。什么都别说了,赶紧努力学习。
ArrayList提供了一个将List转化为数组的方法toArray。toArray有两个重载的方法:
List直接转化为Object[]数组;
第二个方法是将List转化为你需要类型的数组,就是直接转化为T[]类型,但是肯定和存储在列表中的类型是相同的才行。ArrayList<String> ll = new ArrayList<>();
for (int index = 0; index < 10; index++) {
	 ll.add(""+index);
}
String[] array= (String[]) ll.toArray();
如果我们想上面那样使用会报如下错误:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
不能将Object[]转化为String[]类型,如果要转化就只能将每个元素进行逐一转化:
Object[] objects = ll.toArray();
for (int index = 0; index < objects.length; index++) {
    String eString = (String) objects[index];
}
所以第二个方法就可以直接解决上述的问题:
ll.toArray(new String[ll.size()]);
public Object[] toArray() {
  return Arrays.copyOf(elementData, size);
}
public <T> T[] toArray(T[] a) {
  if (a.length < size)
      // Make a new array of a's runtime type, but my contents:
      return (T[]) Arrays.copyOf(elementData, size, a.getClass());
  System.arraycopy(elementData, 0, a, 0, size);
  if (a.length > size)
      a[size] = null;
  return a;
}
System.arraycopy()和Arrays.copyof()的实现和区别?
本文我将讲述使用ssh生成秘钥,免密码向github推送代码。
id_rsa.pub文件id_rsa.pub文件中的内容添加到github上的Add SSH key页面即可
   https://github.com/settings/keysssh地址而非https地址的方式git clone,或者改变remote远程url为ssh
    git clone的时候使用ssh方式
 两个方式的url地址不同,认证方式也不同。使用ssh时保存密钥对以后可以不再输入帐号密码,
而https却不能。remote远程url,如下:
          $ git remote rm origin  
  $ git remote add origin git@github.com:qmsggg37/qmsggg37.github.io.git
以mac为例,其它操作系统也一样。
❯ ssh-keygen -t rsa -C  'qmsggg37@163.com'     
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/qmsggg/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/qmsggg/.ssh/id_rsa.
Your public key has been saved in /Users/qmsggg/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:UUnjU5gUBD8BCcrzqjWL2j8DE4W2WbidZkAs3b6d3Xw qmsggg37@163.com
The key's randomart image is:
+---[RSA 2048]----+
| +.+  ..oBO=.    |
|. B.+.  .+++     |
| o X+.  . =      |
|  = *o   . o     |
|   + o.oSo       |
|  o ..o . o E    |
|   o+      .     |
| . +oo           |
|..+.oo           |
+----[SHA256]-----+
说明:
-t 指定密钥类型,默认即 rsa ,可以省略
-C 设置注释文字,比如你的邮箱,可以省略
生成过程中会提示输入密码两次,如果不想在使用公钥的时候输入密码,可以回车跳过;
密钥默认保存位置在 ~/.ssh 目录下,打开后会看到私钥文件 id_rsa 和公钥文件 id_rsa.pub;
github
https://github.com/settings/keys本教程也适用于ssh免密码登录