内置类与同步

一、内部类与静态内部类

PublicClass.java

/*
 * 内部类
 * 若Run.java和PublicClass.java不在同一个包中,则需要把PrivateClass类声明成public。
 * 在PrivateClass前面加上static即为静态内部类
 * 静态内部类不能访问外部类的非静态对象
 * 非静态内部类中不可以有静态成员。
 * 静态类和方法属于类本身。
 */
public class PublicClass {
static private String username;
static private String password;
static class PrivateClass{
   private String age;
	private String address;
	public String getAge(){
		return age;
	}
	public void setAge(String age){
		this.age=age;
	}
	public String getAddress(){
		return address;
	}
	public void setAddress(String address){
		this.address=address;		
	}
	public void printInfo(){
		System.out.println(username+" "+password);
	}
}
public String getUsername(){
	return username;
}
public void setUsrname(String username){
	this.username=username;
}
public String getPassword(){
	return password;
}
public void setPassword(String password){
	this.password=password;
}
}
Run.java
public class Run {
public static void main(String[] args){
	PublicClass publicclass=new PublicClass();
	publicclass.setUsrname("ltt");
	publicclass.setPassword("lttPassword");
	System.out.println(publicclass.getUsername()+" "+publicclass.getPassword());
	/*
	 * 想要实例化内部类必须这样调用
	 * 	PrivateClass privateclass=publicclass.new PrivateClass();
	 */
	/*
	 * 静态内部类的调用可以不依赖于外部类而被实例化。
	 */
	PrivateClass privateclass=new PrivateClass();
	privateclass.setAge("18");
	privateclass.setAddress("beijing");
	System.out.println(privateclass.getAge()+" "+privateclass.getAddress());
}
}
二、内置类与同步

1.内置类中有两个同步的方法,使用的是不同的的锁,则结果是异步打印的。

outclass.java

public class OutClass {
		static class Inner{
			public void method1(){
				synchronized ("其他的锁") {
					for(int i=0;i<10;i++){
						System.out.println(Thread.currentThread().getName()+" i="+i);
						try {
							Thread.sleep(100);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
			}
			public synchronized void method2(){
				for(int i=11;i<=20;i++){
					System.out.println(Thread.currentThread().getName()+" i="+i);
					try {
						Thread.sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}
Run.java
public class Run {
public static void main(String[] args){
	final Inner inner=new Inner();
	Thread t1=new Thread(new Runnable(){
		@Override
		public void run() {
			inner.method1();
		}	
	},"A");
	Thread t2=new Thread(new Runnable(){

		@Override
		public void run() {
			inner.method2();	
			}		
	},"B");
	t1.start();
	t2.start();
}
}
结果如下:


2.用同步代码块进行类锁,其他线程只能以同步的方式调用被锁类中的静态同步方法。

OutClass.java

public class OutClass {
static class InnerClass2{
	public synchronized void method1(){
		System.out.println(Thread.currentThread().getName()+"进入InnerClass2类里面的method1方法");
		for(int k=0;k<10;k++){
			System.out.println("k="+k);
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
		System.out.println(Thread.currentThread().getName()+"离开InnnerClass2类里面的method1方法");
	}
}
	static class InnerClass1{
		public void method1(InnerClass2 class2){
			synchronized (class2) {
				System.out.println(Thread.currentThread().getName()+"进入InnerClass1里面的method1方法");
				for(int i=0;i<10;i++){
					System.out.println("i="+i);
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
				System.out.println(Thread.currentThread().getName()+"离开InnerClass1里面的method1方法");
				}
		}
		public synchronized void method2(){
			System.out.println(Thread.currentThread().getName()+"进入InnerClass1里面的method2方法");
			for(int j=0;j<10;j++){
				System.out.println("j="+j);
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			System.out.println(Thread.currentThread().getName()+"离开InnerClass1里面的method2方法");
		}
	}
}
Run.java
public class Run {
public static void main(String[] args){
	final InnerClass1 in1=new InnerClass1();
	final InnerClass2 in2=new InnerClass2();
	Thread t1=new Thread(new Runnable(){
		@Override
		public void run() {
			in1.method1(in2);
		}	
	},"A");	
	Thread t2=new Thread(new Runnable(){
		@Override
		public void run() {
			in1.method2();
		}	
	},"B");
	Thread t3=new Thread(new Runnable(){
		@Override
		public void run() {
		  in2.method1();
		}	
	},"C");
	t1.start();
	t2.start();
	t3.start();
}
}
结果如下:


线程AB持有的是不同的锁,所以异步执行,而线程C要等待线程A 执行完后释放锁以后C才能执行。

三、只要对象不变,即使对象的属性变了,结果还是同步的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值