9. 线程安全/共享变量——同步
当多个线程用到同一个变量时,在修改值时存在同时修改的可能性,而此时该变量只能被赋值一次。这就会导致出现“线程安全”问题,这个被多个线程共用的变量称之为“共享变量”。
为了解决线程安全的问题,我们可以使用“同步”来控制线程访问。当一个线程在使用这个共享资源(不仅仅是变量,还可以是集合、对象等)的时候,其他线程就无法访问。
package threadStudy;

public class ThreadSynchronizedTest {

    public static void main(String[] args) throws InterruptedException{
int i=0;
ObjA o = new ObjA(i);
TheThread theThread1 = new TheThread(o);
TheThread theThread2 = new TheThread(o);
theThread1.start();
theThread2.start();
} static class TheThread extends Thread{
private ObjA objA;
public TheThread(ObjA objA){
this.objA = objA;
}
public void run(){
objA.method();
}
} static class ObjA{
int i;
public ObjA(int i){
this.i = i;
}
synchronized public void method(){
for (int j=0;j<10;j++){
i++;
System.out.println(Thread.currentThread().getName()+ ": " + i);
try{
Thread.sleep(200);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
}

以上述代码为例,如果加了关键字synchronized,则一个线程在使用共享资源o时,另一个线程必须等到前一个线程使用完,才能使用。

synchronized的输出结果:

而不加synchronized的输出结果:

10. 容器类并发问题的同步解决方法

JDK中提供了并发容器,可以直接帮我们解决容器类出现的并发问题。它们大部分都存在java.util.concurrent这个包中,包括:ConcurrentHashmap,CopyOnWriteArrayList,ConcurrentLinkedQueue,BlockingQueue,ConcurrentSkipListMap。下面是使用ConcurrentHashmap解决Map容器并发问题的例子:

 package threadStudy;

 import java.util.Collections;
import java.util.HashMap;
import java.util.Map; public class ThreadConcurrencyCollectionTest { public static void main(String[] args) {
Thread thread1 = new Thread(new HashTest.AddThread(0), "T0");
Thread thread2 = new Thread(new HashTest.AddThread(1), "T1");
thread1.start();
thread2.start(); } } class HashTest{
//static Map<String, String> map = new HashMap<String, String>();
static Map<String, String> map = Collections.synchronizedMap(new HashMap<String, String>());
public static class AddThread extends Thread{
private int start;
public AddThread(int start){
this.start = start;
}
public void run(){
for (int i=start; i<10000; i+=2){
System.out.println(Integer.toString(i));
map.put(Integer.toString(i), Integer.toBinaryString(i));
}
} }
}

最新文章

  1. Latex 数学符号表
  2. request获取ip数据
  3. 想找个计算器当本命?来试试UWP应用《纸书科学计算器》
  4. gcc命令行详解
  5. selenium-ide学习
  6. HDU 2298 Toxophily
  7. JavaEE Tutorials (4) - 企业bean入门
  8. spring mvc 和ajax异步交互完整实例
  9. uva 408 Uniform Generator
  10. java自带的监控工具VisualVM一
  11. seajs的常用api简易文档
  12. js验证input是否输入数字
  13. python中线程和进程(一)
  14. kibana转码显示
  15. 高可用Redis(十):Redis原生命令搭建集群
  16. 使用 functional interface 和 lambda 表达式来优化代码
  17. [PHP]正则表达式判断网址
  18. linux判断日志文件大小进行清理
  19. Java-Reflection反射-获取包括父类在内的所有字段
  20. 安装visual studio过程

热门文章

  1. Hello Web API系列教程——Web API与国际化
  2. 6.DNS公司PC访问外网的设置 + 主DNS服务器和辅助DNS服务器的配置
  3. 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)
  4. ShenNiu.MVC管理系统
  5. AFNetworking 3.0 源码解读 总结(干货)(下)
  6. SharpMap简析
  7. C#制作简易屏保
  8. Android的Kotlin秘方(II):RecyclerView 和 DiffUtil
  9. AutoIt实现Webdriver自动化测试文件上传
  10. 我的MYSQL学习心得(十四) 备份和恢复