java中多线程的安全问题以及解决办法(2)
2.使用同步函数来解决线程存在的问题:
1.明确哪些是多线程运行的代码;2.哪些是共享数据;3.明确哪些代码是多线程操作共享数据的。
public static void main(String[] args) {
SynFunction stf=new SynFunction();
new Thread(stf).start();
new Thread(stf).start();
}
public class SynFunction implements Runnable{
private int sum=0;
// Object obj=new Object();
public void run() {
// TODO Auto-generated method stub
//synchronized(obj){
for(int k=0;k<3;k++){
this.add(100);
}
//}
}
public void add(int m){
sum+=m;
System.out.println(Thread.currentThread().getName()+":"+sum);
}
}
结果为:
Thread-0:200
Thread-0:300
Thread-0:400
Thread-1:200
Thread-1:500
Thread-1:600
出现和和谐的结果;
Thread-0:200
Thread-0:300
Thread-0:400
Thread-1:200
Thread-1:500
Thread-1:600
使用同步函数后:
publicclass SynFunctionimplements Runnable{
privateintsum=0;
// Objectobj=newObject();
publicvoid run() {
//TODO Auto-generatedmethod stub
//synchronized(obj){//在此加同步代码块,相当于每一个线程得把各自的三次循环执行完之后其他线程才能执行。就变成了顺序执行。
for(int k=0;k<3;k++){
this.add(100);//同步函数使用的锁对象时this
}
//}
}
publicsynchronized void add(int m){
sum+=m;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//TODO Auto-generatedcatch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+sum);
}
}
结果为:
Thread-0:100
Thread-1:200
Thread-0:300
Thread-1:400
Thread-1:500
Thread-0:600
总结同步函数使用的锁对象时:this
3.静态同步函数使用的锁是:类名.class,该方法所在类的字节码文件。
public class FileRun implements Runnable{
private static int sum=0;
public void run() {
// TODO Auto-generated method stub
for(int k=0;k<3;k++){
add(100);
}
}
public static synchronized void add(int m){
sum+=m;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+sum);
}
}
public static void main(String[] args) {
FileRun fr=new FileRun();
new Thread(fr).start();
new Thread(fr).start();
}
结果为:
Thread-0:100
Thread-1:200
Thread-1:300
Thread-1:400
Thread-0:500
Thread-0:600
相关文章
- java基础---->多线程之yield(三)
- Java多线程之synchronized关键字详解
- java多线程之join方法使用
- Java桌面程序打包成exe可执行文件
- Java多线程基本使用
- JAVA B/S系统实现客户端屏幕截图,Java版的QQ截图
- Java多线程的集合类
- Java多线程之守护线程实战
- java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
- Java-多线程的实现与启动
- Java多线程,启动四个线程,两个运行加一,另外两个运行减一
- JAVA 设计模式 解释器模式
- Java多线程干货系列—(一)Java多线程基础
- Java 练习(家庭收支记账软件)
- java递归原理
- java-jstorm
- 【 java 多线程】同步方式解决多线程的安全问题
- 重新开始学习编程系列Day04——java多线程以及并发相关知识
- Java 多线程的Thread类和Runnable接口
- java 实现微信搜索附近人功能
- 9.JAVA-抽象类定义
- Java多线程-新特征-锁(上)
- Java多线程-线程的调度(守护线程)
- Java多线程教程
- Java多线程:由浅入深看synchronized的底层实现原理
- (RabbitMQ) Java Client API Guide
- java多线程之线程安全(重点,难点)