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接口的类的实例。
个人的一点拙见,欢迎拍砖。
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接口的类的实例。
个人的一点拙见,欢迎拍砖。
相关文章推荐
- Android开发者-对Java和编程的一点总结
- Java面向对象一点小基础总结
- 对java中的wait,notify,synchronized的总结
- 关于Java的二进制输入输出流的一点总结(有错误请指出)
- java中面向对象的一点学习总结
- Java的synchronized关键字:同步机制总结
- Java的synchronized关键字:同步机制总结
- java中形参与实参的一点总结
- Java多线程总结(7)synchronized的缺陷及concurrent.locks包类结构简介
- java中synchronized用法基本总结
- 用Java中的高精度的一点小总结
- 关于java开发邮件接收程序的一点总结
- 关于JAVA中的static和final修饰符的一点总结
- 关于java.io的一点总结
- Java同步机制总结--synchronized
- Java中访问修饰符和构造函数的一点总结
- 关于java的环境变量的一点总结
- Java多线程之对synchronized总结
- (JAVA)对volatile和synchronized以及join()的理解和总结
- Java同步机制总结--synchronized