任何被volatile修饰的变量,都不拷贝副本到工作内存,任何修改都及时写在主存.
java中synchronized的用法
用法1
public class Test{
public synchronized void print(){
....;
}
}
某线程执行print()方法,则该对象将加锁。其它线程将无法执行该对象的所有synchronized块。
用法2
public class Test{
public void print(){
synchronized(this){//锁住本对象
...;
}
}
}
同用法1, 但更能体现synchronized用法的本质。
用法3
public class Test{
private String a = "test";
public void print(){
synchronized(a){//锁住a对象
...;
}
}
public synchronized void t(){
...; //这个同步代码块不会因为print()而锁定.
}
}
执行print(),会给对象a加锁,注意不是给Test的对象加锁,也就是说 Test对象的其它synchronized方法不会因为print()而被锁。同步代码块执行完,则释放对a的锁。
为了锁住一个对象的代码块而不影响该对象其它 synchronized块的高性能写法:
public class Test{
private byte[] lock = new byte[0];
public void print(){
synchronized(lock){
...;
}
}
public synchronized void t(){
...;
}
}
用法4,静态方法的锁
public class Test{
public synchronized static void execute(){
...;
}
}
效果同
public class Test{
public static void execute(){
synchronized(TestThread.class){
...;
}
}
}
java中synchronized的用法
用法1
public class Test{
public synchronized void print(){
....;
}
}
某线程执行print()方法,则该对象将加锁。其它线程将无法执行该对象的所有synchronized块。
用法2
public class Test{
public void print(){
synchronized(this){//锁住本对象
...;
}
}
}
同用法1, 但更能体现synchronized用法的本质。
用法3
public class Test{
private String a = "test";
public void print(){
synchronized(a){//锁住a对象
...;
}
}
public synchronized void t(){
...; //这个同步代码块不会因为print()而锁定.
}
}
执行print(),会给对象a加锁,注意不是给Test的对象加锁,也就是说 Test对象的其它synchronized方法不会因为print()而被锁。同步代码块执行完,则释放对a的锁。
为了锁住一个对象的代码块而不影响该对象其它 synchronized块的高性能写法:
public class Test{
private byte[] lock = new byte[0];
public void print(){
synchronized(lock){
...;
}
}
public synchronized void t(){
...;
}
}
用法4,静态方法的锁
public class Test{
public synchronized static void execute(){
...;
}
}
效果同
public class Test{
public static void execute(){
synchronized(TestThread.class){
...;
}
}
}