代码1:
class X{
private int x=100;
public int getX(){
return x;
}
public synchronized void changeX(int y){
x=x-y;
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+this.getX());
}
public void changeY(){
System.out.println("hello world");
}
}
public class MyThreadTest1 implements Runnable{
private X xxx=new X();
public void run(){
if(Thread.currentThread().getName().equals("t1")){
xxx.changeX(30);
}
if(Thread.currentThread().getName().equals("t2")){
xxx.changeY();
}
}
public static void main(String[] args) {
MyThreadTest1 myXXX=new MyThreadTest1();
Thread t1=new Thread(myXXX,"t1");
Thread t2=new Thread(myXXX,"t2");
t1.start();
t2.start();
}
}
结果:
hello world
t1:70
代码2:
class X{
private int x=100;
public int getX(){
return x;
}
public synchronized void changeX(int y){
x=x-y;
try{
Thread.sleep(1000);
}catch(Exception e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+this.getX());
}
public synchronized void changeY(){ //唯一区别
System.out.println("hello world");
}
}
public class MyThreadTest1 implements Runnable{
private X xxx=new X();
public void run(){
if(Thread.currentThread().getName().equals("t1")){
xxx.changeX(30);
}
if(Thread.currentThread().getName().equals("t2")){
xxx.changeY();
}
}
public static void main(String[] args) {
MyThreadTest1 myXXX=new MyThreadTest1();
Thread t1=new Thread(myXXX,"t1");
Thread t2=new Thread(myXXX,"t2");
t1.start();
t2.start();
}
}
结果:
t1:70
hello world
通过上面的两个例子,一个线程访问一个有synchronizationd关键字的方法的对象后,另外的线程就不能访问这个对象的所有的有synchronized关键字的方法。但如果这个对象有一些不含synchronized关键字的方法,则别的线程仍可访问这些不含synchronized关键字的方法。否则只有等前面那个线程的synchronized方法结束,后面这个线程才能执行有synchronized的方法。