synchronized同步问题

synchronized线程同步,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。


假设现有a,b两线程,abc实例化对象(对象中包含非静态同步块,非静态同步方法,非同步方法,静态同步方法,静态同步代码块),def实例化对象(同上)


1.当两个并发线程同时访问某个实例化对象中的synchronized同步代码块时,一个时间内只能有一个线程访问,一个线程等待,直到第一个线程结束。


2.若两线程中的a正在访问非静态同步方法或者非静态同步代码块时,那么b就只能访问非同步方法。此时线程a访问abc对象的非静态同步方法或者非静态同步代码块获得了一个对象锁,这个对象锁没有解开其他线程就不能访问。


3.此时已知,adc和def是同一类的不同实例对象,其中的代码自然一模一样。假设a和b两线程分别访问adc和def两对象中的静态同步方法或静态同步块,若a线程第一时间访问,那么b线程一样会处于等待状态,直到a线程解锁。


4.总结:当两线程一起访问的是同一个实例化对象中的非静态同步方法时,这个时候的线程锁也可以叫做对象锁。当两线程一起访问的是同一个类的静态同步方法时,这个时候的线程锁叫做类锁。


5.类锁:只要是访问了类中的静态同步块就会获得。这个时候类中的静态同步块只能被一个线程访问

对象锁:只要是访问了类的同一个实例化对象才会获得,这个时候类中的非静态同步块只能被一个线程访问



public class Sync {
	
	public void feiSync(Thread th,int i){//普通方法
		System.out.println("普通方法:"+th.getName()+","+i);
	}
	
	
	public synchronized void NoSync(Thread th,int i){//非静态同步方法
		System.out.println("非静态同步方法:"+th.getName()+","+i);
	}
	
	
	public static synchronized void YesSync(Thread th,int i){//静态同步方法
		System.out.println("静态同步方法:"+th.getName()+","+i);
	}
}

class Runnables implements Runnable{
	
	private Sync sys=new Sync();
	private Thread ths=new Thread();
	public Runnables(Sync sys){
		this.sys=sys;
	}

	@Override
	public void run() {
		for (int i = 0; i < 30; i++) {
			sys.NoSync(ths,i);//两线程一起访问非静态的同步方法,
		}
		
	}
	
	public void setTh(Thread th){
		this.ths=th;
	}

}

public class test {
	 
	public static void main(String[] args) {
		Sync sy=new Sync();//实例化对象,内含多个同步方法
		
		Runnables rn1=new Runnables(sy);//线程1
		Thread th1=new Thread(rn1);
		rn1.setTh(th1);
		th1.start();//启动线程1
		
		Runnables rn2=new Runnables(sy);//线程2
		Thread th2=new Thread(rn2);
		rn1.setTh(th2);
		th2.start();//启动线程2
	}

}

调用NoSync()方法时:输出结果为
非静态同步方法:Thread-2,0
非静态同步方法:Thread-2,1
非静态同步方法:Thread-2,2
非静态同步方法:Thread-2,3
非静态同步方法:Thread-2,4
非静态同步方法:Thread-2,5
非静态同步方法:Thread-2,6
非静态同步方法:Thread-2,7
非静态同步方法:Thread-2,8
非静态同步方法:Thread-2,9
非静态同步方法:Thread-2,10
非静态同步方法:Thread-2,11
非静态同步方法:Thread-2,12
非静态同步方法:Thread-2,13
非静态同步方法:Thread-2,14
非静态同步方法:Thread-2,15
非静态同步方法:Thread-2,16
非静态同步方法:Thread-2,17
非静态同步方法:Thread-2,18
非静态同步方法:Thread-2,19
非静态同步方法:Thread-2,20
非静态同步方法:Thread-2,21
非静态同步方法:Thread-2,22
非静态同步方法:Thread-2,23
非静态同步方法:Thread-2,24
非静态同步方法:Thread-2,25
非静态同步方法:Thread-2,26
非静态同步方法:Thread-2,27
非静态同步方法:Thread-2,28
非静态同步方法:Thread-2,29
非静态同步方法:Thread-3,1
非静态同步方法:Thread-3,2
非静态同步方法:Thread-3,3
非静态同步方法:Thread-3,4
非静态同步方法:Thread-3,5
非静态同步方法:Thread-3,6
非静态同步方法:Thread-3,7
非静态同步方法:Thread-3,8
非静态同步方法:Thread-3,9
非静态同步方法:Thread-3,10
非静态同步方法:Thread-3,11
非静态同步方法:Thread-3,12
非静态同步方法:Thread-3,13
非静态同步方法:Thread-3,14
非静态同步方法:Thread-3,15
非静态同步方法:Thread-3,16
非静态同步方法:Thread-3,17
非静态同步方法:Thread-3,18
非静态同步方法:Thread-3,19
非静态同步方法:Thread-3,20
非静态同步方法:Thread-3,21
非静态同步方法:Thread-3,22
非静态同步方法:Thread-3,23
非静态同步方法:Thread-3,24
非静态同步方法:Thread-3,25
非静态同步方法:Thread-3,26
非静态同步方法:Thread-3,27
非静态同步方法:Thread-3,28
非静态同步方法:Thread-3,29
线程执行的先后顺序是一般优先级。



sys.YesSync(ths,i);
调用同一个实例化对象的YesSync时输出结果为:
静态同步方法:Thread-3,0
静态同步方法:Thread-3,1
静态同步方法:Thread-3,2
静态同步方法:Thread-3,3
静态同步方法:Thread-3,4
静态同步方法:Thread-3,5
静态同步方法:Thread-3,6
静态同步方法:Thread-3,7
静态同步方法:Thread-3,8
静态同步方法:Thread-3,9
静态同步方法:Thread-3,10
静态同步方法:Thread-3,11
静态同步方法:Thread-3,12
静态同步方法:Thread-3,13
静态同步方法:Thread-3,14
静态同步方法:Thread-3,15
静态同步方法:Thread-3,16
静态同步方法:Thread-3,17
静态同步方法:Thread-3,18
静态同步方法:Thread-3,19
静态同步方法:Thread-3,20
静态同步方法:Thread-3,21
静态同步方法:Thread-3,22
静态同步方法:Thread-3,23
静态同步方法:Thread-3,24
静态同步方法:Thread-3,25
静态同步方法:Thread-3,26
静态同步方法:Thread-3,27
静态同步方法:Thread-3,28
静态同步方法:Thread-3,29
静态同步方法:Thread-2,0
静态同步方法:Thread-2,1
静态同步方法:Thread-2,2
静态同步方法:Thread-2,3
静态同步方法:Thread-2,4
静态同步方法:Thread-2,5
静态同步方法:Thread-2,6
静态同步方法:Thread-2,7
静态同步方法:Thread-2,8
静态同步方法:Thread-2,9
静态同步方法:Thread-2,10
静态同步方法:Thread-2,11
静态同步方法:Thread-2,12
静态同步方法:Thread-2,13
静态同步方法:Thread-2,14
静态同步方法:Thread-2,15
静态同步方法:Thread-2,16
静态同步方法:Thread-2,17
静态同步方法:Thread-2,18
静态同步方法:Thread-2,19
静态同步方法:Thread-2,20
静态同步方法:Thread-2,21
静态同步方法:Thread-2,22
静态同步方法:Thread-2,23
静态同步方法:Thread-2,24
静态同步方法:Thread-2,25
静态同步方法:Thread-2,26
静态同步方法:Thread-2,27
静态同步方法:Thread-2,28
静态同步方法:Thread-2,29
显然也会有线程锁。




Sync sy=new Sync();//实例化对象,内含多个同步方法
Sync sy2=new Sync();
当我调用不同实例化对象时输出结果一样:
静态同步方法:Thread-3,0
静态同步方法:Thread-3,1
静态同步方法:Thread-3,2
静态同步方法:Thread-3,3
静态同步方法:Thread-3,4
静态同步方法:Thread-3,5
静态同步方法:Thread-3,6
静态同步方法:Thread-3,7
静态同步方法:Thread-3,8
静态同步方法:Thread-3,9
静态同步方法:Thread-3,10
静态同步方法:Thread-3,11
静态同步方法:Thread-3,12
静态同步方法:Thread-3,13
静态同步方法:Thread-3,14
静态同步方法:Thread-3,15
静态同步方法:Thread-3,16
静态同步方法:Thread-3,17
静态同步方法:Thread-3,18
静态同步方法:Thread-3,19
静态同步方法:Thread-3,20
静态同步方法:Thread-3,21
静态同步方法:Thread-3,22
静态同步方法:Thread-3,23
静态同步方法:Thread-3,24
静态同步方法:Thread-3,25
静态同步方法:Thread-3,26
静态同步方法:Thread-3,27
静态同步方法:Thread-3,28
静态同步方法:Thread-3,29
静态同步方法:Thread-2,0
静态同步方法:Thread-2,1
静态同步方法:Thread-2,2
静态同步方法:Thread-2,3
静态同步方法:Thread-2,4
静态同步方法:Thread-2,5
静态同步方法:Thread-2,6
静态同步方法:Thread-2,7
静态同步方法:Thread-2,8
静态同步方法:Thread-2,9
静态同步方法:Thread-2,10
静态同步方法:Thread-2,11
静态同步方法:Thread-2,12
静态同步方法:Thread-2,13
静态同步方法:Thread-2,14
静态同步方法:Thread-2,15
静态同步方法:Thread-2,16
静态同步方法:Thread-2,17
静态同步方法:Thread-2,18
静态同步方法:Thread-2,19
静态同步方法:Thread-2,20
静态同步方法:Thread-2,21
静态同步方法:Thread-2,22
静态同步方法:Thread-2,23
静态同步方法:Thread-2,24
静态同步方法:Thread-2,25
静态同步方法:Thread-2,26
静态同步方法:Thread-2,27
静态同步方法:Thread-2,28
静态同步方法:Thread-2,29



sys.NoSync(ths,i);
sys.feiSync(ths, i);
当我调用了非synchronized方法时的结果为:
非静态同步方法:Thread-3,0
普通方法:Thread-3,0
非静态同步方法:Thread-3,1
普通方法:Thread-3,1
非静态同步方法:Thread-3,2
普通方法:Thread-3,2
非静态同步方法:Thread-3,3
普通方法:Thread-3,3
非静态同步方法:Thread-3,4
普通方法:Thread-3,4
非静态同步方法:Thread-3,5
普通方法:Thread-3,5
非静态同步方法:Thread-3,6
普通方法:Thread-3,6
非静态同步方法:Thread-3,7
普通方法:Thread-3,7
非静态同步方法:Thread-3,8
普通方法:Thread-3,8
非静态同步方法:Thread-3,9
普通方法:Thread-3,9
非静态同步方法:Thread-3,10
普通方法:Thread-3,10
非静态同步方法:Thread-3,11
普通方法:Thread-3,11
非静态同步方法:Thread-3,12
普通方法:Thread-3,12
非静态同步方法:Thread-3,13
普通方法:Thread-3,13
非静态同步方法:Thread-3,14
普通方法:Thread-3,14
非静态同步方法:Thread-3,15
普通方法:Thread-3,15
非静态同步方法:Thread-3,16
普通方法:Thread-3,16
非静态同步方法:Thread-3,17
普通方法:Thread-3,17
非静态同步方法:Thread-3,18
普通方法:Thread-3,18
非静态同步方法:Thread-3,19
普通方法:Thread-3,19
非静态同步方法:Thread-3,20
普通方法:Thread-3,20
非静态同步方法:Thread-3,21
普通方法:Thread-3,21
非静态同步方法:Thread-3,22
普通方法:Thread-3,22
非静态同步方法:Thread-3,23
普通方法:Thread-3,23
非静态同步方法:Thread-3,24
普通方法:Thread-3,24
非静态同步方法:Thread-2,0
普通方法:Thread-2,0
非静态同步方法:Thread-2,1
普通方法:Thread-2,1
非静态同步方法:Thread-2,2
普通方法:Thread-2,2
非静态同步方法:Thread-2,3
普通方法:Thread-2,3
非静态同步方法:Thread-2,4
普通方法:Thread-2,4
非静态同步方法:Thread-2,5
普通方法:Thread-2,5
非静态同步方法:Thread-2,6
普通方法:Thread-2,6
非静态同步方法:Thread-2,7
普通方法:Thread-2,7
非静态同步方法:Thread-2,8
普通方法:Thread-2,8
非静态同步方法:Thread-2,9
普通方法:Thread-2,9
非静态同步方法:Thread-2,10
普通方法:Thread-2,10
非静态同步方法:Thread-2,11
普通方法:Thread-2,11
非静态同步方法:Thread-2,12
普通方法:Thread-2,12
非静态同步方法:Thread-2,13
普通方法:Thread-2,13
非静态同步方法:Thread-2,14
普通方法:Thread-2,14
非静态同步方法:Thread-2,15
普通方法:Thread-2,15
非静态同步方法:Thread-2,16
普通方法:Thread-2,16
非静态同步方法:Thread-2,17
普通方法:Thread-2,17
非静态同步方法:Thread-2,18
普通方法:Thread-2,18
非静态同步方法:Thread-2,19
普通方法:Thread-2,19
非静态同步方法:Thread-2,20
普通方法:Thread-2,20
非静态同步方法:Thread-2,21
普通方法:Thread-2,21
非静态同步方法:Thread-2,22
普通方法:Thread-2,22
非静态同步方法:Thread-2,23
普通方法:Thread-2,23
非静态同步方法:Thread-2,24
普通方法:Thread-2,24
非静态同步方法:Thread-2,25
普通方法:Thread-2,25
非静态同步方法:Thread-2,26
普通方法:Thread-2,26
非静态同步方法:Thread-2,27
普通方法:Thread-2,27
非静态同步方法:Thread-2,28
普通方法:Thread-2,28
非静态同步方法:Thread-2,29
普通方法:Thread-2,29
非静态同步方法:Thread-3,25
普通方法:Thread-3,25
非静态同步方法:Thread-3,26
普通方法:Thread-3,26
非静态同步方法:Thread-3,27
普通方法:Thread-3,27
非静态同步方法:Thread-3,28
普通方法:Thread-3,28
非静态同步方法:Thread-3,29
普通方法:Thread-3,29


很显然当一个线程访问同步方法时,其他线程可以访问非同步方法,只有当前一个同步方法执行完后,后一个线程才会去执行要访问的同步方法。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值