java中的synchronize(修饰方法)
2016-07-03 21:54
801 查看
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不能继承
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不能继承
相关文章推荐
- java环境常见错误
- java初始化顺序
- java中如何声明一个十六进制的字符串,或者说,怎么发送一个十六进制数据?
- win10环境 myeclipse 10 关闭maven在myeclipse打开时自动更新
- java简单排序-选择排序
- JAVA中方法和变量在继承中的覆盖和隐藏
- 2、对象和类
- JavaEE学习笔记之SSH—Hibernate(1)
- java中JSP惯用200多个的脚本
- java适配器模式(Adapter)-结构型
- HeadFirstJava——5_编写程序
- 【java】[转]标记接口和标记注解注解
- JAVA数据源连接方式汇总
- 8.4 sikuli 集成进eclipse 报错:Unsupported major.minor version 51.0
- Andriod项目开发实战(1)——如何在Eclipse中的一个包下建新包
- Java内存堆栈分析
- 8.3 sikuli 集成进eclipse 报错:eclipse中运行提示 Win32Util.dll: Can't load 32-bit .dll on a AMD 64 bit platform
- Java多线程之线程同步
- Java多线程之控制线程
- java中字符集的问题