synchronized在用法

1。synchronized 方法控制对类成员变量的访问:synchronized方法
public synchronized void accessVal(int newVal){}
2。synchronized代码块控制对类的静态成员变量的访问。
synchronized(syncObject) {
//允许访问控制的代码
}
  synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

notify()及notifyAll()是Object的方法,与Object的wait()方法配合使用,而且这三个方法必须在同步块中调用.



如下:
在线程1中执行如下代码

Java代码
...
synchronized(obj1) //1.进入同步块
{
try {
...
obj1.wait(); //2.进入暂停状态
}catch (InterruptedException exp) {}
}

...
synchronized(obj1) //1.进入同步块
{
try {
...
obj1.wait(); //2.进入暂停状态
}catch (InterruptedException exp) {}
}


1.当前同步对象(monitor)为obj1,obj1是任一实例,若是同步方法,则同步对象是this。进入同步块后,obj1为锁定状态,锁定状态对obj1本身无任何影响,而其它线程执行到同一代码时,因不能获得锁,处于Block状态,一旦解锁,被block的线程自动继续执行。
2.调用obj1.wait()有两个作用,一是使线程进入等待状态,二是解锁obj1。这时被block的线程将获得锁,线程1要退出等待必须要由其它线程显式的调用obj1.notify()或notifyAll()方法。





Java代码
...
synchronized(obj1)
{
...
obj1.notify(); //3. 向wait的线程发通知信息
...
}
...

...
synchronized(obj1)
{
...
obj1.notify(); //3. 向wait的线程发通知信息
...
}
...若其它线程执行到此时,线程1处于wait状态,则wait状态解除,解除后,线程1若得到锁就能继续执行,若有多个线程处于obj1的wait状态,notify将随机选一个线程激活,而notifyAll是同时解除所有的wait状态。
notifyAll() 让等待某个对象K的所有线程离开阻塞状态,
notify() 随机地选取等待某个对象K的线程,让它离开阻塞状态。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值