---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ---------------------
1、Synchronized关键字,该关键字可以加到方法里面,包围一段代码,
Eg:Synchronized(对象锁)
{
.............
}
也可以直接加到方法上面,位置是方法的返回值前面,
Eg:public Synchronized void show()
{
.............
}
其实方法上的Synchronized关键字用的锁对象是this,就是谁调用的他,锁就是谁。
2、一道面试题:
在子线程循环中循环10次,在主线程中循环100次,如此往复50次。
public class TraditionalThreadCommunication {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final Business bus = new Business();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 50; i++) {
bus.subRun();
}
}
}).start();
for (int i = 0; i < 50; i++) {
bus.mainRun();
}
}
}
class Business {
boolean flag = true;
public synchronized void subRun() {
while (flag) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0; i < 10; i++) {
System.out.println("sub----------------------" + i);
}
flag = true;
this.notify();
}
public synchronized void mainRun() {
while (!flag) {
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for (int i = 0; i < 100; i++) {
System.out.println("main---------------------" + i);
}
flag = false;
this.notify();
}
}
线程范围内的共享变量(每个数据是与线程相关的)
核心思想:定义一个map来存放当前线程,及该线程操作的变量的值
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class ThreadScopeVariable {
private static int data;
static Map<Thread, Integer> map = new HashMap<Thread, Integer>();
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
for (int i = 0; i < 2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized (String.class) {
Random ran = new Random();
data = ran.nextInt();
System.out.println(Thread.currentThread().getName()
+ data);
map.put(Thread.currentThread(), data);
}
System.out.println("A模块数据"
+ Thread.currentThread().getName()
+ new ModuleA().getData());
System.out.println("B模块数据"
+ Thread.currentThread().getName()
+ new ModuleB().getData());
}
}).start();
}
}
static class ModuleA {
public int getData() {
int data = map.get(Thread.currentThread());
return data;
}
}
static class ModuleB {
public int getData() {
int data = map.get(Thread.currentThread());
return data;
}
}
}
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------