1.下列关于Java并发的说法中正确的是()
A.CopyOnWriteArrayList适用于写多读少的并发场景
B.ReadWriteLock适用于读多写少的并发场景
C.ConcurrentHashMap的写操作不需要加锁,读操作需要加锁
D.只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了
正确答案为B。
A,CopyOnWriteArrayList适用于写少读多的并发场景
B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥, 读与读之间可以并发执行。在读多写少的情况下可以提高效率
C,ConcurrentHashMap是同步的HashMap,读写都加锁
D,volatile只保证多线程操作的可见性,不保证原子性
2.下面哪段代码实现了GBK编码字节流到UTF-8编码字节流的转换
byte[] src,dst;
A.dst=String.fromBytes(src,"GBK").getBytes("UTF-8")
B.dst=new String(src,"GBK").getBytes("UTF-8")
C.dst=new String("GBK",src).getBytes()
D.dst=String.encode(String.decode(src,"GBK")),"UTF-8" )
正确答案为B。
操作步骤就是先编码再解码。先通过new String(src, “gbk”)解码得到字符串,然后再通过getBytes(“utf-8”)来得到UTF-8编码字节数组
A/D错误原因:String类并没有fromBytes/encode/decode方法
C错误原因:getBytes()没有指定编码格式
3.如下代码,执行test()函数后,屏幕打印结果为()
public class Test2
{
public void add(Byte b)
{
b = b++;
}
public void test()
{
Byte a = 127;
Byte b = 127;
add(++a);
System.out.print(a + " ");
add(b);
System.out.print(b + "");
}
}
执行结果为:-128 127
b=b++并不会改变b的值
而a在进行add之前便进行了自增++a,byte类型的数据范围是: -128, 127之间,因此a=127进行了越界,其值变成了-128
4.以下哪些类是线程安全的()
Vector
HashMap
ArrayList
StringBuffer
Properties
正确结果为:Vector/StringBuffer/Properties
所谓线程安全就是线程同步,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问。
线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
Vector类的许多操作都是加了synchronized修饰的,用于保证线程的安全,比如他的写入元素的操作方法
public synchronized void addElement(E obj) { modCount++;
ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = obj;
}
而HashMap的许多操作都是没有添加synchronized修饰的,比如他的写入put方法:
public V put(K key, V value) {
if (key == null)
return
putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for(Entry<K,V> e = table[i]; e != null; e = e.next) {
Object k;
if (e.hash == hash &&((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return
oldValue; }
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
ArrayList也是线程不安全的
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
StringBuffer类是线程安全的
public synchronized StringBuffer append(String str) {
super.append(str);
return this;
}
Properties类也是线程安全的
public synchronized
Object setProperty(String key, String value) {
return
put(key, value);
}