每个对象都有一把锁,当多个并发thread访问同一个对象时,可以用锁来进行线程的同步。
如果一个线程需要得到锁(标志为synchronized),而锁被另一个线程拥有,则等待,如果一个线程不需要得到锁(没有标志为synchronized),则不管对象有没有被锁,不需要等待。也就是说能不能使用对象跟锁没有必然的关系,要看使用对象的线程有没有得到锁的需要(标志为synchronized)
private Set set = new HashSet();
public Sample() {
for (int i = 0; i < 100; i++) {
set.add(new Integer(i));
}
}
public void print() throws Exception {
synchronized (set) {
for (Iterator it = set.iterator(); it.hasNext();) {
Integer i = (Integer) it.next();
Thread.sleep((int) (Math.random() * 100));
System.out.println("i is " + i);
}
}
}
public void put() throws Exception {
set.add(101);
Thread.sleep((int) (Math.random() * 1000000));
}