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免密码登录