- 直接作用于实例方法,相当于给当前对象加锁,进入同步代码前要获得当前实例的锁。这个锁称为对象锁,加锁的对象是当前实例,两个线程使用的是同一个对象
public class Syn implements Runnable {
static Syn syn=new Syn();
static int i=0;
//synchronized直接作用于实例方法,需要拿到对象锁
public synchronized void increase() {
// TODO Auto-generated method stub
i++;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int j=0;j<10000;j++)
{
increase();
}
}
public static void main(String[] args) throws InterruptedException {
//两个线程同时执行syn对象的run方法
Thread thread=new Thread(syn);
Thread thread1=new Thread(syn);
thread.start();
thread1.start();
thread.join();
thread1.join();
System.out.println(i);
}
}
2.直接作用于静态方法,相当于给当前类加锁,进入同步方法要获得当前类的锁。我们首先看这个例子,尽管加了synchronized这个关键字,依然是线程不安全的。因为这时两个不同的线程指向不同的对象。如果在synchronized加static ,就能够保持线程安全。此时请求是当前类的类锁。这个锁称为类锁。
public class Syn implements Runnable {
//static Syn syn=new Syn();
static int i=0;
public static synchronized void increase() {
// TODO Auto-generated method stub
i++;
}
@Override
public void run() {
// TODO Auto-generated method stub
for(int j=0;j<10000;j++)
{
increase();
}
}
public static void main(String[] args) throws InterruptedException {
Thread thread=new Thread(new Syn());
Thread thread1=new Thread(new Syn());
thread.start();
thread1.start();
thread.join();
thread1.join();
System.out.println(i);
}
}
参考自java高并发程序设计