synchronized中this

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使用的监视器是同一个.

  1. 多个线程对同一个对象调用synchronize方法或者带有synchronize(this)代码块时候,都是同步的,阻塞的,都会按顺序执行
  2. 在多个线程情况下,使用synchronize进行同步时,只有其中一个会执行synchronize方法,其他线程执行其他的synchronize将会呈阻塞状态,等待同步
  3. 在同一个时间片内,只有一个线程可以执行synchronize方法,可以持有监视器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值