一:通常情况下,在遇到并发问题时,我们首先想到的时在方法上面加synchronized关键字,或者
1:将可能会产生并发问题的代码使用synchronized修饰,这样访问该段代码的时候,线程就会一个一个排队
访问,这时创建的锁一般为对象锁。
如果创建两个实例,分别依附在两个线程上,那么会出现什么情况呢?
/**
*
*/
package com.day1;
/**
* @author Administrator 多线程操作
*/
public class MultiThread {
private int num = 0;
public synchronized void printNum(String tag) {
if ("a".equals(tag)) {
num = 100;
System.out.println("tag=" + tag + " num=" + num);
try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
num = 200;
System.out.println("tag=" + tag + " num=" + num);
}
}
public static void main(String[] args) {
final MultiThread thread1 = new MultiThread();
final MultiThread thread2 = new MultiThread();
new Thread() {
public void run() {
thread1.printNum("a");
}
}.start();
new Thread() {
public void run() {
thread2.printNum("b");
}
}.start();
}
}
运行结果:
tag=a num=100
tag=b num=200
运行结束后,等待一秒钟,然后虚拟机停止运行。
两个线程分别运行不同的实例,其实他们之间没有任何关系,各自运行各自的,因为锁是两个,就是两个对象锁,
不会导致另一个线程阻塞。
:2:如果将成员变量修改成static的,会怎样呢?
private static int num = 0;
static修饰的静态变量,属于类,由该类创建的实例共享这个的变量的值。
3:如果将printNum方法修改为static方法,打印结果会怎样?
首先打印tag=a num=100,然后停顿1s,再打印tag=b num=200
可以看出这里产生了阻塞,因为同步方法是static的,所以该锁为类锁,不同的实例访问该方法时产生了
阻塞,第一个线程先进入,释放锁后第二个线程再进入。