1.修饰方法
2.修饰代码块,参数可以是this,其他对象,类
package concurrent.basic;
/**
* synchroized用法
* @author liufq
*
*/
public class SyncTest {
private Object lock = new Object();
private int i = 0;
public void t1() {
//非原子操作,非线程安全
i++;
}
/**
* 同步方法,以this对象作为锁,线程安全
* 缺点:如果有多个同步方法,会使用同一把锁
*/
public synchronized void t2() {
i++;
}
public void t3() {
/**
* 同步块,以this对象为锁
* 缺点:如果有多个同步方法,会使用同一把锁
*/
synchronized (this) {
i++;
}
}
public void t4() {
/**
* 同步块,以创建的Object对象为锁
* 优点:如果有多个同步方法,可以创建多个对象作为锁
*/
synchronized (this) {
i++;
}
}
public void t5() {
/**
* 同步块,类锁,以Class对象作为锁
* 优点:以this作为锁的同步方法和同步块,通过new多个对象可以并发,类锁可以避免这种情况
*/
synchronized (SyncTest.class) {
i++;
}
}
public int getI() {
return i;
}
public static void main(String[] args) throws InterruptedException {
final SyncTest syncTest = new SyncTest();
for (int i = 0; i < 10000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
syncTest.t1();//执行结果小于10000
//syncTest.t2();
//syncTest.t3();
//syncTest.t4();
//syncTest.t5();
}
}).start();
}
Thread.sleep(10000);
System.out.println(syncTest.getI());
}
}