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的线程,让它离开阻塞状态。
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的线程,让它离开阻塞状态。