1、&和&&的区别
&的用法
第一个是作为逻辑运算符使用,被当成逻辑运算符时有一个非短路的特性,即当第一个操作数为false时,那么第二个操作数仍然执行。第二个操作是作为位运算使用
&&用法
只有一个用法,只能作为逻辑运算符使用,在使用时有短路的特性,即当第一个操作数为false时,第二个操作数不会执行
2、i++是否线程安全
i++的线程安全性可总觉如下: 1)如果i时局部变量,那么是可重入的,也就是线程安全的。 2)如果i时全局变量,则同一进程的不同线程都可能访问到该变量,因而是线程不安全的
每个线程都有自己的工作内存,每个线程需要对共享变量操作时必须先把共享变量从主内存load到自己的工作内存,等完成对共享变量操作时再save到主内存。 也就是说,如果一个线程运算完后还没刷到主内存,此时这个共享变量的值被另外一个线程从主内存读取到了,这个时候读取的数据就是脏数据了
这就是经典的内存不可见的问题,那么把变量加上volatile让内存可见能否解决这个问题呢?答案是不能,因为volatile只能保证可见性,不能保证原子性,多个线程同时读取这个共享变量的值,就算保证其他线程修改的可见性,也不能保证线程之间读取到同样的值然后覆盖了对方的值这类情况不发生
解决方法 1.对i++操作的方法加同步锁,此时只有一个线程进行i++操作 2.使用支持原子操作的类,如java.util.concurrent.atomic.AtomicInteger,它使用了CSA算法,效率更优