您的位置:首页 > 编程语言 > Java开发

java synchronized的一点总结

2012-10-19 11:19 429 查看
由于synchronized代码块还有点疑惑,所以现在只谈谈synchronized方法。

1.synchronized针对的一个类的同一个实例而言的。如果是不同的实例,synchronized无用。

package com.icss.entity;

public class TestThread2 {

/**

* @param args

*/

public static void main(String[] args) {

MyThread thread1 = new MyThread();

new Thread(thread1, "t1").start();

new Thread(thread1, "t2").start();

}

}

class MyThread implements Runnable{

@Override

public void run() {

// TODO Auto-generated method stub

Operation op = new Operation();

op.print();

}

}

class Operation{

public synchronized void print(){

try {

int count = 5;

while(count > 0){

Thread.sleep(500);

System.out.println(Thread.currentThread().getName()+"========="+count);

count --;

}

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

如果是上面的代码,因为是两个operation的实例,所以没有synchronized的效果。

修改如下代码:

class MyThread implements Runnable{

Operation op = new Operation();

@Override

public void run() {

// TODO Auto-generated method stub

op.print();

}

}

则可以有synchronized的效果。

另外,如果修改如下代码:

public static void main(String[] args) {

MyThread thread1 = new MyThread();

MyThread thread2 = new MyThread();

new Thread(thread1, "t1").start();

new Thread(thread2, "t2").start();

}

class MyThread implements Runnable{

@Override

public synchronized void run() {

// TODO Auto-generated method stub

Operation op = new Operation();

op.print();

}

}

则不会对run()方法起到synchronized作用。因为两个线程对应的是两个不同的实现了Runnable接口的类的实例。

个人的一点拙见,欢迎拍砖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: