为啥同步?简单来讲,一个线程在对某对象操作时,不想被其他线程的同步方法所干扰。
在实际编程中,我们有两种方式实现同步,分别是同步方法(synchronized methods)或同步块(synchronized block/synchronized statement)。
同步方法是在方法前加synchronized, 如果该方法是static的,则认为锁是相对于Class的,其他线程操作该类的任何对象时,遇到static同步方法或者方法内同步该Class时,需要等待;若该方法不是static的,则认为锁是相对于自身对象(this)的,其他线程操作此对象时,遇到同步方法(非static),需要等待。
同步块一般写在函数里,形式如下:
模式代码
1.synchronized ( Expression ) Block
synchronized ( Expression ) Block
Expression需是引用类型(对象,类), Block则是代码块。同步块开始时需要获得Expression的一个互斥锁(mutual-exclusion lock)。当该锁没被其他线程占用时,获取该锁并则执行Block里内容,在Block结束后释放此锁。在执行Block时,任何其他想要获得该锁的线程需要阻塞等待。
[注意点]
1. 可以认为锁是属于引用类型的, 同步的操作需要获取锁之后才进行,否则一直等待。编程时需注意锁(synchronized)的对象
2. 线程在wait后会释放持有的锁。有关wait详细说明参见本文第二部分。
3. 各线程同步时遵守先触发,先得锁原则(happens-before relationship)。
4. 构造函数无法被synchronized。
|