synchronized和static synchronized区别浅谈
一、synchronized介绍
1.使用的时候一般是同步方法或者同步块
同步方法
public synchronized void syncTest(){ //doSomething } 同步代码块(效率高于同步方法) public void syncTest(){ synchronized(this){ //doSomething } }
2.synchronized持有的是一个类的实例的锁,所以如果一个线程进入了一个synchronized方法或代码块那么他就必须获得当前这个实例的锁,此时别的线程如果想要访问当前这个实例中的同步方法或同步块都将被阻塞住,普通方法的访问不受影响
public class LockDemo { protected volatile static int count=0; public synchronized void setNum() throws InterruptedException{ for(int i=0;i<5;i++){ count+=i; Thread.sleep(1000); } System.out.println("setNum执行完毕,锁释放"); } public synchronized int getNum(){ return count; } }
final LockDemo lock = new LockDemo(); Thread a = new Thread(new Runnable() { @Override public void run() { try { lock.setNum(); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread b = new Thread(new Runnable() { @Override public void run() { System.out.println(lock.getNum()); } }); a.start(); b.start();
//输出结果:
setNum执行完毕,锁释放
10
二、static synchronized介绍
1.使用的时候一般是同步方法或者同步块
2.static synchronized持有的是一个类的锁(类的锁和实例的锁是不同的),所有实例都会共享这个锁,如果一个线程进入了static synchronized方法或代码块,那么此时别的线程如果想要访问当前这个类中的static synchronized方法或同步块都将被阻塞住,synchronized方法和普通方法的访问不受影响
三、总结
两者的区别很明显:synchronized是实例锁,锁住的只是当前实例
static synchronized是类锁,锁住的是这个类的所有实例