java的关键字
synchronized为防止资源冲突提供了内置支持。当任务要执行被synchronized关键字保护起来的代码段时,它将检查锁是否可用,然后获取锁、执行代码、释放锁。
1.锁的粒度
1.1作用于普通方法
锁的粒度是当前对象。
在对象上调用其
任意synchronized方法时,
此对象(this)被加锁,此时该对象上的
其他synchronized方法只有等到前一个方法调用完毕并释放了锁之后才能被调用。
两个对象并发调用同一synchronized方法,并不会互斥。
1.2所用于静态方法
锁的是这个类,即XX.class
1.3 锁住指定对象
如 synchronized (obj) {...}。
2.代码示例
我们期望generator.next()每次都产生的是偶数,这在单线程下没任何问题。但多线程下就会有产生奇数的可能。
将 public int next() {} 改为synchronized public int next() {} 即可解决问题。所有对象都自动含有单一的锁(也成为监视器)。
Thread.
yield()告诉java线程调度器“重要的部分我已经完成,此刻可以将我挂起,切换给其他线程执行”。这个函数可用可不用,但用了它更容易按照自己的掌控去切换线程,从而验证一些东西。