/** * * 1.什么情况下需要同步 * 当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步. * 如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码. * 2.同步代码块 * 使用synchronized关键字加上一个锁对象来定义一段代码, 这就叫同步代码块 * 多个同步代码块如果使用相同的锁对象, 那么他们就是同步的 * */ public static void main(String[] args) { final Print p = new Print(); new Thread() { @Override public void run() { while(true) { p.printNum(); } } }.start(); new Thread() { @Override public void run() { while(true) { p.printChar(); } } }.start(); } } class Print { public void printNum() { synchronized (Print.class) {//锁对象可以是任意对象,但是被锁的代码需要保证是同一把锁,不能用匿名对象 System.out.print(1); System.out.print(2); System.out.print(3); System.out.print(4); System.out.print(5); System.out.println(); } } public void printChar() { synchronized (Print.class) { System.out.print("a"); System.out.print("b"); System.out.print("c"); System.out.println(); }
/* * 非静态同步函数的锁是:this * 静态的同步函数的锁是:字节码对象 */ public synchronized void printChar() { System.out.print("a"); System.out.print("b"); System.out.print("c"); System.out.println(); }