`
chelsea500
  • 浏览: 7297 次
社区版块
存档分类
最新评论

java中synchronized的用法

 
阅读更多
任何被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){
                ...;
            }
        }
    }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics