/**
* * 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();
}