java 学习之路——线程2(synchronized静态代码块)

实现同步方法的方式有两种:

  1.用synchronized关键字修饰的方法可以实现线程的同步;

  2.用synchronized代码块修饰的部分实现线程的同步。

以下为第二种方式的实现:

 

package com.lcq.ThreadTest;


/**
 * 类名:ThreadTest6
 * 功能:线程的同步问题,使用关键字synchronized静态代码块修饰
 * 时间:
 * 结果:当一个synchronized块被调用时,该类的其他方法无法调用
 * @version 1.0
 * @author lcq
 */


public class ThreadTest6 {

	public static void main(String[] args) {
		
		Example2 example = new Example2();
		
		//定义两个线程访问同一个资源
        Thread t1 = new MyThread6(example);
        Thread t2 = new MyThread7(example);
        
        //分别调用资源类的同步方法
        t1.start();
        t2.start();
	}
}

class Example2{
	/*
	 * 定义一个同步类型的方法1
	 */
	private Object obj = new Object();
	//private Object obj2 = new Object();
	
	public void execute(){
		synchronized(obj){
			for (int i = 0; i <20; i++) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("Hello :" + i);
		}
		}
		
		
	}
	
	//定义一个同步类型的方法2
	public void execute2(){
		synchronized (obj) {
			for (int i = 0; i <20; i++) {
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("World :" + i);
		}

		}
			}
	
	
}

//定义一个线程类1
class MyThread7 extends Thread{
	
	Example2 example = new Example2();
	public MyThread7(Example2 example2){
		this.example = example2;
	}
	@Override
	public void run() {
		this.example.execute();
	}
}

//定义一个线程类2
class MyThread6 extends Thread{
	
	Example2 example = new Example2();
	public MyThread6(Example2 example2){
		this.example = example2;
	}
	@Override
	public void run() {
		this.example.execute2();
	}
}


从以上代码中可以看出:第一种方式是粗粒度的线程控制,而第二种方式是细粒度的线程控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值