Java学习——同步synchronized关键字

synchronized的作用:同一个时刻最多只有一个线程执行该代码,以达到保证并发安全的效果。

synchronized的用法:对象锁(默认锁对象为this当前实例对象),同步代码块锁(自己指定锁对象

                                    类锁:synchronized修饰静态的方法以及指定锁为class对象

1.同步代码块锁:

package com.zx.synchronize;
/**
 * 对象锁  代码块形式
 * @author Administrator
 *
 */
public class SynchronizeBlock01 implements Runnable {
	
	static SynchronizeBlock01 instance=new SynchronizeBlock01();
	
	Object lock1=new Object();
	Object lock2=new Object();
	
	@Override
	public void run() {
		synchronized (lock1) {
			System.out.println("我是lock1,我叫"+Thread.currentThread().getName());
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"lock1部分运行结束");
		}
		
		synchronized (lock2) {
			System.out.println("我是lock2,我叫"+Thread.currentThread().getName());
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"lock2部分运行结束");
		}
	}
	
	public static void main(String[] args) {
		Thread t1=new Thread(instance);
		Thread t2=new Thread(instance);
		t1.start();
		t2.start();
		while (t1.isAlive() || t2.isAlive()) {
			
		}
		System.out.println("finished");
	}
}

打印结果:

我是lock1,我叫Thread-0
Thread-0lock1部分运行结束
我是lock2,我叫Thread-0
我是lock1,我叫Thread-1
Thread-0lock2部分运行结束
Thread-1lock1部分运行结束
我是lock2,我叫Thread-1
Thread-1lock2部分运行结束
finished

2.方法锁:

package com.zx.synchronize;
/**
 * 对象锁  方法锁
 * @author Administrator
 *
 */
public class SynchronizedBlock02 implements Runnable {
	
	static SynchronizedBlock02 instance=new SynchronizedBlock02();
	
	@Override
	public void run() {
		block();
	}
	
	public static void main(String[] args) {
		Thread t1=new Thread(instance);
		Thread t2=new Thread(instance);
		t1.start();
		t2.start();
		while (t1.isAlive() || t2.isAlive()) {
			
		}
		System.out.println("finished");
	}
	
	public synchronized void block() {
		System.out.println("我的对象锁的方法修饰符形式,我叫"+Thread.currentThread().getName());
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()+"运行结束");
	}
}

打印结果:

我的对象锁的方法修饰符形式,我叫Thread-0
Thread-0运行结束
我的对象锁的方法修饰符形式,我叫Thread-1
Thread-1运行结束
finished

3.类锁的static方法:

package com.zx.synchronizeclass;
/**
 * 类锁的第一种形式:static形式
 * @author Administrator
 *
 */
public class SynchronizedClassStatic implements Runnable{
	
	static SynchronizedClassStatic instance1=new SynchronizedClassStatic();
	static SynchronizedClassStatic instance2=new SynchronizedClassStatic();

	public static void main(String[] args) {
		Thread t1=new Thread(instance1);
		Thread t2=new Thread(instance2);
		t1.start();
		t2.start();
		while (t1.isAlive() || t2.isAlive()) {
			
		}
		System.out.println("finished");
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		block();
	}
	
	public static synchronized void block() {
		System.out.println("我的类锁的第一种形式:static形式,我叫"+Thread.currentThread().getName());
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(Thread.currentThread().getName()+"运行结束");
	}

}

打印结果:

我的类锁的第一种形式:static形式,我叫Thread-1
Thread-1运行结束
我的类锁的第一种形式:static形式,我叫Thread-0
Thread-0运行结束
finished

4.类锁:synchronized(*.class) 

package com.zx.synchronizeclass;
/**
 * 类锁的第二种形式:synchronized(*.class)
 * @author Administrator
 *
 */
public class SynchronizedClassClass implements Runnable{

	static SynchronizedClassClass instance1=new SynchronizedClassClass();
	static SynchronizedClassClass instance2=new SynchronizedClassClass();
	
	public static void main(String[] args) {
		Thread t1=new Thread(instance1);
		Thread t2=new Thread(instance2);
		t1.start();
		t2.start();
		while (t1.isAlive() || t2.isAlive()) {
			
		}
		System.out.println("finished");
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		method();
	}
	
	private void method() {
		synchronized (SynchronizedClassStatic.class) {
			System.out.println("我的类锁的第二种形式:synchronized(*.class),我叫"+Thread.currentThread().getName());
			try {
				Thread.sleep(3000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"运行结束");
		}
	}

}

 打印结果:

我的类锁的第二种形式:synchronized(*.class),我叫Thread-0
Thread-0运行结束
我的类锁的第二种形式:synchronized(*.class),我叫Thread-1
Thread-1运行结束
finished

 

 

 

                                           

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值