1、一个错误的线程例子:如下:
package thread;
/**
* 下面程序中你会发现好像synchronized不起作用了,虽然加入了synchronized 但是不能同步
* 原因在于:
* 自己new了三个不同的对象,然后不同的对象启动了一个不同的线程。
*
* @author 2500216
*
*/
public class TreadDemo extends Thread {
int n=10;
public void run(){
treadTest();
}
public synchronized void treadTest(){
while(n>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(n--);
}
}
public static void main(String[] args) {
TreadDemo tread1=new TreadDemo();
TreadDemo tread2=new TreadDemo();
TreadDemo tread3=new TreadDemo();
tread1.start();
tread2.start();
tread3.start();
}
}
结果为:
2、把字段变为static,方法同步(synchronized),对变量static 访问出现错乱,结果如下:
package thread;
/**
* 对变量加static 出现访问出现错乱。
* @author 2500216
*
*/
public class Treadmeno1 extends Thread{
private static int n=100;
public void run(){
treadTest();
}
public synchronized void treadTest(){
while(n>0){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String str = Thread.currentThread().getName();
System.out.println("name="+str+" =====>n="+n);
n--;
}
}
public static void main(String[] args) {
Treadmeno1 tread1=new Treadmeno1();
tread1.setName("tread1");
System.out.println(Thread.currentThread().getName());
Treadmeno1 tread2=new Treadmeno1();
tread2.setName("tread2");
Treadmeno1 tread3=new Treadmeno1();
tread3.setName("tread3");
tread1.start();
tread2.start();
System.out.println(Thread.currentThread().getName());
tread3.start();
}
}
结果如图: