Java线程:线程的同步与锁
1.同步和锁
java中每个对象都有一个内置锁,程序执行非静态的synchronized同步方法时,自动获得执行该方法的对象有关的锁.
一个对象只有一个锁,当一个线程获得锁,其他线程不能进入该对象上的synchronized方法或代码块.直到锁被释放.
线程可以有多个锁,例如,一个对象的同步方法中调用另一个对象的同步方法
2.静态方法的同步
同步静态方法,用的是类对象的锁,即xx.class.
3.线程安全类
对类中的方法进行了同步,但操作这个类时仍然不一定安全.
例如:
public class NameList{
private List nameList=Collections.synchonizedList(new LinkedList());
public void add(String name){
nameList.add(name);
}
public Stirng removeFirst(){
if(nameList.size()>0){
return (String)nameList.remove(0);
}else{
return null;
}
}
}
public classTest{
public static void main(String[] args){
final NameList list=new NameList();
nl.add("aaa");
class NameDropper extends Thread{
public void run(){
String name = nl.removeFirst();
System.out.println(name);
}
}
Thread t1 = new NameDropper();
Thread t2 = new NameDropper();
t1.start();
t2.start();
}
}
虽然集合对象时安全的,但程序还是有问题的,解决办法 ,在两个方法上进行同步synchronized
4.java中实现线程同步:
a.将需要同步访问的资源定义为private
b.哪里修改此资源,使用synchronized关键字同步操作的方法或者代码块
5.总结:
线程的同步是为了保护多线程访问同一个资源时,对资源的破坏
线程同步方法时通过锁来实现的,每个对象仅仅有一个锁,一个线程获得了对象锁,其他线程就无法访问该对象的同步方法
对于静态同步方法,锁是针对这个类的,锁对象时这个类的Class对象,静态和非静态方法的锁互不干涉,
当多个线程等待一个对象锁时,没有获得锁的线程将发生阻塞
死锁是线程间相互等待对方的锁造成的,死锁发生,程序死掉