实现同步方法的方式有两种:
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(); } }
从以上代码中可以看出:第一种方式是粗粒度的线程控制,而第二种方式是细粒度的线程控制。