synchronized 的作用与用法
- 方法声明时使用,放在范围操作符(public等)后,其返回类型声明(void等)之前。即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入。
public synchronized void synMethod() {
//方法体
}
- 对某一代码块使用,synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块。
public int synMethod(Object a1){
synchronized(Object) {
//一次只能有一个线程进入
}
}
- synchronized后面括号里是一对象,此时,线程获得的是对象锁。
public class MyThread implements Runnable {
public static void main(String args[]) {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt, "t1");
Thread t2 = new Thread(mt, "t2");
Thread t3 = new Thread(mt, "t3");
Thread t4 = new Thread(mt, "t4");
Thread t5 = new Thread(mt, "t5");
Thread t6 = new Thread(mt, "t6");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
//如果线程进入,则得到对象锁,那么别的线程在该类所有对象上的任何操作都不能进行。在对象级使用锁通常是一种比较粗糙的方法。
public void run() {
synchronized (this) { //这里的this则为MyThread对象
System.out.println(Thread.currentThread().getName());
}
}
}