Synchronize对方法的修饰可分为对一般方法的修饰和对静态方法的修饰,首先看Synchronize对一般方法的修饰。
Synchronize对一般方法的修饰和对代码块的修饰没有什么区别,对代码块的修饰作用范围是Synchronize(this){ // 作用范围},大括号中的代码是作用范围,而对方法修饰的作用范围就是整个方法。如果把代码块中的代码提出来作为一个方法二者没有什么本质上的区别。
将上篇博客中的例子修改为如下:(不同之处为将Synchronize原先只对for循环修改为对整个run方法的修饰)
<span style="font-size:18px;">public synchronized void run() {
for (int i = 0; i < 5; i++) {
try {
System.out.println(Thread.currentThread().getName() + ":" +(count++));
Thread.sleep(1000);
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}</span>
运行结果和对只修饰代码块的结果是一样的。
除了对一般方法修饰Synchronize还可以对静态方法进行修饰,我们知道类中的静态方法是属于所有实例化的对象的,可以推断如果Synchronize修饰一个静态方法那么该类所有实例化出来的对象对这个方法都是线程同步的。通过如下的实例验证:
<span style="font-size:18px;">public class SyncThread implementsRunnable{
private static int count;
public SyncThread() {
count = 0;
}
public synchronized static void test() {
for (int i = 0; i < 5; i++) {
try {
System.out.println(Thread.currentThread().getName() + ":" +(count++));
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void run() {
test();
}
public int getCount() {
return count;
}
publicstatic void main(String[] args){
SyncThreadsyncThread1 = new SyncThread();
SyncThreadsyncThread2 = new SyncThread();
Threadthread1 = new Thread(syncThread1, "SyncThread1");
Threadthread2 = new Thread(syncThread2, "SyncThread2");
thread1.start();
thread2.start();
}
}</span>
结果展示:
结果分析:
本次虽然也是实例化的两个线程类,但是运行的结果却和只有一个线程实例类是一样的,因为在run中调用的是test这个静态的方法,这个方法时属于所有的对象,所以即使实例化的三个线程类,它们还是保持同步的。
小结:
1、 定义接口方法是不能够使用Synchronize
2、 类的构造方法不可以使用
3、 Synchronize不能继承