当使用多线程的时候很容易发生一个问题就是类似与银行转账的问题假设路人A在银行有100快他同时转两笔80快如果不做任何的操作两笔80很容易直接转账成功就相当于取了160快。
下面用一个简单的例子描述下
实现一个输出方法
public void outPut(String name){
for (int i=0;i<name.length();i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
使用两个多线程来输出
new Thread(new Runnable() {
public void run() {
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
outPut.outPut("zhangsansansansan");
}
}
}).start();
new Thread(new Runnable() {
public void run() {
while (true){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
outPut.outPut("lisisisisisi");
}
}
}).start();
}
观察他是混乱的
可以使用同步代码块和同步方法解决如下
public void outPut1(String name){
synchronized(this){
for (int i=0;i<name.length();i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
public synchronized void outPut2(String name){
for (int i=0;i<name.length();i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
注意当同步代码快和静态同步方式同时使用时需要
public void outPut1(String name){
synchronized(OutPut.class){
for (int i=0;i<name.length();i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
}
public static synchronized void outPut3(String name){
for (int i=0;i<name.length();i++){
System.out.print(name.charAt(i));
}
System.out.println();
}
文章地址:http://www.haha174.top/article/details/255556
项目源码:https://github.com/haha174/thread-learning.git