package a.thread; public class A { private static int x = 0; public void run() { // 同步代码块 synchronized (this) { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "=====;x=" + x); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } x++; } } } // 同步方法 public synchronized void aa() { for (int i = 0; i < 10; i++) { System.out .println(Thread.currentThread().getName() + "====;x=" + x); x++; } } }
package a.thread; public class MainB { public static void main(String[] args) { final A a1 = new A(); Thread[] threads = new Thread[5]; for (int i = 0; i < 5; i++) { threads[i] = new Thread(new Runnable() { public void run() { a1.aa(); a1.run(); } }); threads[i].setName("线程" + i); threads[i].start(); try { threads[i].sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } for (int i = 0; i < 5; i++) { try { threads[i].join(); } catch (InterruptedException e) { e.printStackTrace(); } } } }
同步方法---使用synchronized修饰的方法:
访问修饰符 synchronized [static] 数据返回类型 方法名() {
...........
}
防止多个线程同时访问这个类中的synchronized static 方法。static可以省略,它可以对类的所有对象实例起作用。
同步语句块---只对这个区块的资源实行互斥访问:
synchronized(共享对象名){
被同步的代码段
}
1)它锁定的是共享对象名对应的当前对象。
2)线程中实现同步块一般是在run方法中添加。