synchronized(this)
//此处this指的是进入此代码块的线程对象(也就是那个对象调用了该方法,就表示当前锁是那个对象),如果t1进来了,那么锁住t1,若t1时间片结束了,t2走到此处也只能在上一句代码处等待t1获得了时间片后执行完synchronized锁住的所有代码,t2才能进去执行,若去掉synchronized(this),则t1和t2随时都可以进来执行此段代码中的任何一步,时间到了另一个接着进来执行
synchronized 修饰方法
用范围是整个方法,所以方法中所有的代码都是同步的
对于非静态方法,同一个实例的线程访问会被拦截,非同一实例可以同时访问。 即此时是默认对象锁(this)
对于静态方法,静态方法默认类锁。
采用类锁,无所谓哪个类,都会被拦截
synchronized (this)举例说明 :
public class SynchronizedTest {
private void method1() {
synchronized (this) {
System.out.println("method1当前线程:" + Thread.currentThread().getName());
System.out.println("method1执行过程1");
System.out.println("method1执行过程2");
System.out.println("method1执行过程3");
System.out.println("method1执行过程4");
System.out.println("method1执行过程5");
System.out.println("method1执行过程6");
}
}
public void test1() {
new Thread() {
@Override
public void run() {
super.run();
method1();
}
}.start();
}
}
首先我们定义一个SynchronizedTest 类,然后里面定义两个方法,method1方法只是 打印几行,相当于该方法的执行过程,test1方法里new 了一个线程去执行method1方法
如果我们进行如下调用会如何打印:
通过打印我们发现线程不是同步的,为什么?难道synchronized没有起作用?其实并非如此,是因为synchronized中的this每次都不是同一个对象,也就是不是同一个锁,自然10个线程执行的时候也就不会相互干扰,因为我们每次执行test1()的时候都是new SynchronizedTest()一个新的对象,自然线程执行的时候也就是使用的不同的锁。自然不会同步。
好,现在我们换一种执行策略,上代码:
现在我们观看打印:
可以看到,不管我执行多少边该代码,该方法中的代码块都是顺序执行的,换句话说,每次只能有一个线程执行该方法,而且必须等到该方法只想完成,才能让下一个线程执行,也就是打印所示,method1方法必须一次从过程1执行到过程6,才能换下个线程执行该方法。为什么?这次又和上面不一样呢?因为这次我们只是创建了一个SynchronizedTest对象,循环10次调用test1的时候每次也都是用同一SynchronizedTest对象,自然synchronized中的this指的是这同一个对象,换句话说这10个线程一直使用的是同一把对象锁,所以必须等到持有锁的线程将自己的代码执行完才能将锁释放出来,交个下一个线程执行,这样的话,该方法自然顺序执行的。
如果将加锁的方式改为直接加在方法上,道理是和SynchronizedTest(this)一样的
如上的写法和synchronized(this)是一个意思。运行效果是一样的,上面的锁都表示执行该线程的的对象。
现在我们继续修改代码:
在synchronized 中添加两个方法
public class SynchronizedTest {
private void method1() {
synchronized (this) {
System.out.println("method1当前线程:" + Thread.currentThread().getName());
System.out.println("method1执行过程1");
System.out.println("method1执行过程2");
System.out.println("method1执行过程3");
System.out.println("method1执行过程4");
System.out.println("method1执行过程5");
System.out.println("method1执行过程6");
}
}
public void test1() {
new Thread() {
@Over