synchronized(this)
public class SyncThisTest implements Runnable {
public String a = "同步方法测试this";
public synchronized void setA(String f) {
a = f;
}
@Override
public void run() {
synchronized (this) {
while (true) {
try {
System.out.println(a);
TimeUnit.SECONDS.sleep(1);
// Thread.yield();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws InterruptedException {
SyncThisTest a = new SyncThisTest();
Thread thread = new Thread(a);
thread.setName("this测试");
thread.start();
TimeUnit.MILLISECONDS.sleep(500);
a.setA("gggg");
}
}
console:
同步方法测试this
同步方法测试this
同步方法测试this
同步方法测试this
同步方法测试this
......
使用synchronize(this),a.setA(“gggg”) 是一直不会被执行,可见synchronize是拿到的当前对象的锁,其他带有synchronize的方法都必须等释放资源,如果把a.setA(“gggg”)上的同步去掉,那么就没有任何影响
把a.setA("gggg")上的同步去掉
cnosole:
同步方法测试this
gggg
gggg
。。。
synchronized代码块的同步性
使用synchronize(this)同步代码块的时候,需要注意,当一个线程访问一个synchronize(this)时候,其他线程对同一个Object访问synchronize(this)的代码块将被阻塞,这说明synchronize使用的监视器是同一个.
- 多个线程对同一个对象调用synchronize方法或者带有synchronize(this)代码块时候,都是同步的,阻塞的,都会按顺序执行
- 在多个线程情况下,使用synchronize进行同步时,只有其中一个会执行synchronize方法,其他线程执行其他的synchronize将会呈阻塞状态,等待同步
- 在同一个时间片内,只有一个线程可以执行synchronize方法,可以持有监视器。