java并发基础多线程学习(4)-线程范围内共享数据
假设一个场景:现在有一个公共变量火车票数量。多个线程同时执行操作然后去获取最后的火车票数量。那么肯定会出现数据混乱的问题:
package com.nuanshui.frms.native1.thread;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
/**
* @author liyy
* @description:多线程变量共享问题
* @date 2019-03-27 18:21
* @program frms-parent
*/
public class ThreadScopeShareData {
public static int ticket = 100;
// private static ConcurrentHashMap<String,Integer> concurrentHashMap = new ConcurrentHashMap<String,Integer>();
// public static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
public static void main(String[] args){
for(int i=0;i<2;i++){
new Thread(new Runnable() {
@Override
public void run() {
int buy = new Random().nextInt(10);
System.out.println(Thread.currentThread().getName()+"买到:"+buy+"张票");
int temp = ticket-buy;
System.out.println(Thread.currentThread().getName()+"买票后剩余:"+temp+"张票");
ticket = temp;
// concurrentHashMap.put(Thread.currentThread().getName(),data);
// threadLocal.set(data);
new ThreadScopeShareData().getData1();
new ThreadScopeShareData().getData2();
}
}).start();
}
}
//方法一获取data
public void getData1(){
// System.out.println(Thread.currentThread().getName()+",data:"+concurrentHashMap.get(Thread.currentThread().getName()));
System.out.println(Thread.currentThread().getName()+",data:"+ticket);
}
//方法二获取data
public void getData2(){
System.out.println(Thread.currentThread().getName()+",data:"+ticket);
}
}
执行结果多次:会出现如下结果:
"C:\Program Files\Java\jdk1.8.0_05\bin\java" -javaagent:C:\bqs\liyy\学习\ideaIU-2017.2.3.win1\lib\idea_rt.jar=53938:C:\bqs\liyy\学习\ideaIU-2017.2.3.win1\bin -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_05\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_05\jre\lib\rt.jar;C:\Users\liyy\IdeaProjects\20171024\workspace1\frms-code\frms-pre\target\classes;C:\Users\liyy\IdeaProjects\20171024\workspace1\frms-code\frms-repository-api\target\classes;C:\Users\liyy\.m2\repository\org\springframework\spring-context\4.3.8.RELEASE\spring-context-4.3.8.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\spring-beans\4.3.8.RELEASE\spring-beans-4.3.8.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\spring-expression\4.3.8.RELEASE\spring-expression-4.3.8.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\spring-web\4.3.8.RELEASE\spring-web-4.3.8.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-netflix-core\1.3.1.RELEASE\spring-cloud-netflix-core-1.3.1.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot-autoconfigure\1.5.3.RELEASE\spring-boot-autoconfigure-1.5.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\hateoas\spring-hateoas\0.23.0.RELEASE\spring-hateoas-0.23.0.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\spring-webmvc\4.3.8.RELEASE\spring-webmvc-4.3.8.RELEASE.jar;C:\Users\liyy\.m2\repository\com\nuanshui\frms\frms-activemq-api\0.2.0\frms-activemq-api-0.2.0.jar;C:\Users\liyy\.m2\repository\com\nuanshui\frms\frms-message-api\1.0.7\frms-message-api-1.0.7.jar;C:\Users\liyy\.m2\repository\com\nuanshui\frms\frms-flowio-api\0.0.4\frms-flowio-api-0.0.4.jar;C:\Users\liyy\IdeaProjects\20171024\workspace1\frms-code\frms-engine-api\target\classes;C:\Users\liyy\IdeaProjects\20171024\workspace1\frms-code\frms-dataexchange-api\target\classes;C:\Users\liyy\.m2\repository\alipay\zmxy\zmxy-sdk-java\1.0.1\zmxy-sdk-java-1.0.1.jar;C:\Users\liyy\IdeaProjects\20171024\workspace1\frms-code\frms-entity\target\classes;C:\Users\liyy\.m2\repository\org\hibernate\javax\persistence\hibernate-jpa-2.1-api\1.0.0.Final\hibernate-jpa-2.1-api-1.0.0.Final.jar;C:\Users\liyy\.m2\repository\org\springframework\data\spring-data-commons\1.13.3.RELEASE\spring-data-commons-1.13.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\slf4j\jcl-over-slf4j\1.7.25\jcl-over-slf4j-1.7.25.jar;C:\Users\liyy\.m2\repository\org\hibernate\hibernate-validator\5.3.5.Final\hibernate-validator-5.3.5.Final.jar;C:\Users\liyy\.m2\repository\javax\validation\validation-api\1.1.0.Final\validation-api-1.1.0.Final.jar;C:\Users\liyy\.m2\repository\org\jboss\logging\jboss-logging\3.3.1.Final\jboss-logging-3.3.1.Final.jar;C:\Users\liyy\.m2\repository\com\fasterxml\classmate\1.3.3\classmate-1.3.3.jar;C:\Users\liyy\.m2\repository\com\alibaba\fastjson\1.2.56\fastjson-1.2.56.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-starter-eureka\1.3.1.RELEASE\spring-cloud-starter-eureka-1.3.1.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot-starter-web\1.5.3.RELEASE\spring-boot-starter-web-1.5.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot-starter-tomcat\1.5.3.RELEASE\spring-boot-starter-tomcat-1.5.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\apache\tomcat\embed\tomcat-embed-core\8.5.14\tomcat-embed-core-8.5.14.jar;C:\Users\liyy\.m2\repository\org\apache\tomcat\embed\tomcat-embed-websocket\8.5.14\tomcat-embed-websocket-8.5.14.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-starter\1.2.2.RELEASE\spring-cloud-starter-1.2.2.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-context\1.2.2.RELEASE\spring-cloud-context-1.2.2.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\security\spring-security-rsa\1.0.3.RELEASE\spring-security-rsa-1.0.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\bouncycastle\bcpkix-jdk15on\1.55\bcpkix-jdk15on-1.55.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-netflix-eureka-client\1.3.1.RELEASE\spring-cloud-netflix-eureka-client-1.3.1.RELEASE.jar;C:\Users\liyy\.m2\repository\com\netflix\eureka\eureka-client\1.6.2\eureka-client-1.6.2.jar;C:\Users\liyy\.m2\repository\org\codehaus\jettison\jettison\1.3.7\jettison-1.3.7.jar;C:\Users\liyy\.m2\repository\stax\stax-api\1.0.1\stax-api-1.0.1.jar;C:\Users\liyy\.m2\repository\com\netflix\netflix-commons\netflix-eventbus\0.3.0\netflix-eventbus-0.3.0.jar;C:\Users\liyy\.m2\repository\com\netflix\netflix-commons\netflix-infix\0.3.0\netflix-infix-0.3.0.jar;C:\Users\liyy\.m2\repository\commons-jxpath\commons-jxpath\1.3\commons-jxpath-1.3.jar;C:\Users\liyy\.m2\repository\joda-time\joda-time\2.9.9\joda-time-2.9.9.jar;C:\Users\liyy\.m2\repository\org\antlr\antlr-runtime\3.4\antlr-runtime-3.4.jar;C:\Users\liyy\.m2\repository\org\antlr\stringtemplate\3.2.1\stringtemplate-3.2.1.jar;C:\Users\liyy\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\liyy\.m2\repository\com\google\code\gson\gson\2.8.0\gson-2.8.0.jar;C:\Users\liyy\.m2\repository\org\apache\commons\commons-math\2.2\commons-math-2.2.jar;C:\Users\liyy\.m2\repository\com\netflix\archaius\archaius-core\0.7.4\archaius-core-0.7.4.jar;C:\Users\liyy\.m2\repository\javax\ws\rs\jsr311-api\1.1.1\jsr311-api-1.1.1.jar;C:\Users\liyy\.m2\repository\com\netflix\servo\servo-core\0.10.1\servo-core-0.10.1.jar;C:\Users\liyy\.m2\repository\com\netflix\servo\servo-internal\0.10.1\servo-internal-0.10.1.jar;C:\Users\liyy\.m2\repository\com\sun\jersey\jersey-core\1.19.1\jersey-core-1.19.1.jar;C:\Users\liyy\.m2\repository\com\sun\jersey\jersey-client\1.19.1\jersey-client-1.19.1.jar;C:\Users\liyy\.m2\repository\com\sun\jersey\contribs\jersey-apache-client4\1.19.1\jersey-apache-client4-1.19.1.jar;C:\Users\liyy\.m2\repository\org\apache\httpcomponents\httpclient\4.5.3\httpclient-4.5.3.jar;C:\Users\liyy\.m2\repository\org\apache\httpcomponents\httpcore\4.4.6\httpcore-4.4.6.jar;C:\Users\liyy\.m2\repository\com\google\inject\guice\4.1.0\guice-4.1.0.jar;C:\Users\liyy\.m2\repository\javax\inject\javax.inject\1\javax.inject-1.jar;C:\Users\liyy\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;C:\Users\liyy\.m2\repository\com\netflix\eureka\eureka-core\1.6.2\eureka-core-1.6.2.jar;C:\Users\liyy\.m2\repository\org\codehaus\woodstox\woodstox-core-asl\4.4.1\woodstox-core-asl-4.4.1.jar;C:\Users\liyy\.m2\repository\javax\xml\stream\stax-api\1.0-2\stax-api-1.0-2.jar;C:\Users\liyy\.m2\repository\org\codehaus\woodstox\stax2-api\3.1.4\stax2-api-3.1.4.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-starter-archaius\1.3.1.RELEASE\spring-cloud-starter-archaius-1.3.1.RELEASE.jar;C:\Users\liyy\.m2\repository\commons-configuration\commons-configuration\1.8\commons-configuration-1.8.jar;C:\Users\liyy\.m2\repository\com\google\guava\guava\18.0\guava-18.0.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-starter-ribbon\1.3.1.RELEASE\spring-cloud-starter-ribbon-1.3.1.RELEASE.jar;C:\Users\liyy\.m2\repository\com\netflix\ribbon\ribbon\2.2.2\ribbon-2.2.2.jar;C:\Users\liyy\.m2\repository\com\netflix\ribbon\ribbon-transport\2.2.2\ribbon-transport-2.2.2.jar;C:\Users\liyy\.m2\repository\io\reactivex\rxnetty-contexts\0.4.9\rxnetty-contexts-0.4.9.jar;C:\Users\liyy\.m2\repository\io\reactivex\rxnetty-servo\0.4.9\rxnetty-servo-0.4.9.jar;C:\Users\liyy\.m2\repository\io\reactivex\rxnetty\0.4.9\rxnetty-0.4.9.jar;C:\Users\liyy\.m2\repository\io\netty\netty-codec-http\4.0.27.Final\netty-codec-http-4.0.27.Final.jar;C:\Users\liyy\.m2\repository\io\netty\netty-codec\4.0.27.Final\netty-codec-4.0.27.Final.jar;C:\Users\liyy\.m2\repository\io\netty\netty-handler\4.0.27.Final\netty-handler-4.0.27.Final.jar;C:\Users\liyy\.m2\repository\io\netty\netty-transport-native-epoll\4.0.27.Final\netty-transport-native-epoll-4.0.27.Final.jar;C:\Users\liyy\.m2\repository\io\netty\netty-common\4.0.27.Final\netty-common-4.0.27.Final.jar;C:\Users\liyy\.m2\repository\io\netty\netty-buffer\4.0.27.Final\netty-buffer-4.0.27.Final.jar;C:\Users\liyy\.m2\repository\io\netty\netty-transport\4.0.27.Final\netty-transport-4.0.27.Final.jar;C:\Users\liyy\.m2\repository\com\netflix\ribbon\ribbon-core\2.2.2\ribbon-core-2.2.2.jar;C:\Users\liyy\.m2\repository\com\netflix\ribbon\ribbon-httpclient\2.2.2\ribbon-httpclient-2.2.2.jar;C:\Users\liyy\.m2\repository\com\netflix\netflix-commons\netflix-commons-util\0.1.1\netflix-commons-util-0.1.1.jar;C:\Users\liyy\.m2\repository\com\netflix\ribbon\ribbon-loadbalancer\2.2.2\ribbon-loadbalancer-2.2.2.jar;C:\Users\liyy\.m2\repository\com\netflix\netflix-commons\netflix-statistics\0.1.1\netflix-statistics-0.1.1.jar;C:\Users\liyy\.m2\repository\io\reactivex\rxjava\1.1.10\rxjava-1.1.10.jar;C:\Users\liyy\.m2\repository\com\netflix\ribbon\ribbon-eureka\2.2.2\ribbon-eureka-2.2.2.jar;C:\Users\liyy\.m2\repository\com\thoughtworks\xstream\xstream\1.4.9\xstream-1.4.9.jar;C:\Users\liyy\.m2\repository\xmlpull\xmlpull\1.1.3.1\xmlpull-1.1.3.1.jar;C:\Users\liyy\.m2\repository\xpp3\xpp3_min\1.1.4c\xpp3_min-1.1.4c.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-starter-feign\1.3.1.RELEASE\spring-cloud-starter-feign-1.3.1.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-commons\1.2.2.RELEASE\spring-cloud-commons-1.2.2.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\security\spring-security-crypto\4.2.2.RELEASE\spring-security-crypto-4.2.2.RELEASE.jar;C:\Users\liyy\.m2\repository\io\github\openfeign\feign-core\9.5.0\feign-core-9.5.0.jar;C:\Users\liyy\.m2\repository\org\jvnet\animal-sniffer-annotation\1.0\animal-sniffer-annotation-1.0.jar;C:\Users\liyy\.m2\repository\io\github\openfeign\feign-slf4j\9.5.0\feign-slf4j-9.5.0.jar;C:\Users\liyy\.m2\repository\io\github\openfeign\feign-hystrix\9.5.0\feign-hystrix-9.5.0.jar;C:\Users\liyy\.m2\repository\com\netflix\hystrix\hystrix-core\1.5.12\hystrix-core-1.5.12.jar;C:\Users\liyy\.m2\repository\org\hdrhistogram\HdrHistogram\2.1.9\HdrHistogram-2.1.9.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-starter-config\1.3.1.RELEASE\spring-cloud-starter-config-1.3.1.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\cloud\spring-cloud-config-client\1.3.1.RELEASE\spring-cloud-config-client-1.3.1.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot-starter-validation\1.5.3.RELEASE\spring-boot-starter-validation-1.5.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot-starter\1.5.3.RELEASE\spring-boot-starter-1.5.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot-starter-logging\1.5.3.RELEASE\spring-boot-starter-logging-1.5.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\slf4j\jul-to-slf4j\1.7.25\jul-to-slf4j-1.7.25.jar;C:\Users\liyy\.m2\repository\org\slf4j\log4j-over-slf4j\1.7.25\log4j-over-slf4j-1.7.25.jar;C:\Users\liyy\.m2\repository\org\yaml\snakeyaml\1.17\snakeyaml-1.17.jar;C:\Users\liyy\.m2\repository\org\apache\tomcat\embed\tomcat-embed-el\8.5.14\tomcat-embed-el-8.5.14.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot-starter-aop\1.5.3.RELEASE\spring-boot-starter-aop-1.5.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\spring-aop\4.3.8.RELEASE\spring-aop-4.3.8.RELEASE.jar;C:\Users\liyy\.m2\repository\org\aspectj\aspectjweaver\1.8.10\aspectjweaver-1.8.10.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot-starter-actuator\1.5.3.RELEASE\spring-boot-starter-actuator-1.5.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot-actuator\1.5.3.RELEASE\spring-boot-actuator-1.5.3.RELEASE.jar;C:\Users\liyy\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;C:\Users\liyy\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.8.8\jackson-databind-2.8.8.jar;C:\Users\liyy\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.8.8\jackson-core-2.8.8.jar;C:\Users\liyy\.m2\repository\com\fasterxml\jackson\datatype\jackson-datatype-jsr310\2.8.8\jackson-datatype-jsr310-2.8.8.jar;C:\Users\liyy\.m2\repository\org\apache\commons\commons-lang3\3.4\commons-lang3-3.4.jar;C:\Users\liyy\.m2\repository\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;C:\Users\liyy\.m2\repository\commons-io\commons-io\1.4\commons-io-1.4.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot-starter-cache\1.5.3.RELEASE\spring-boot-starter-cache-1.5.3.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\spring-context-support\4.3.8.RELEASE\spring-context-support-4.3.8.RELEASE.jar;C:\Users\liyy\.m2\repository\org\ehcache\ehcache\3.3.1\ehcache-3.3.1.jar;C:\Users\liyy\.m2\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;C:\Users\liyy\.m2\repository\javax\cache\cache-api\1.0.0\cache-api-1.0.0.jar;C:\Users\liyy\.m2\repository\allinpay\pdsinter\1.0.2\pdsinter-1.0.2.jar;C:\Users\liyy\.m2\repository\allinpay\signtool\0.0.1\signtool-0.0.1.jar;C:\Users\liyy\.m2\repository\100credit\bsApi\3.4.2\bsApi-3.4.2.jar;C:\Users\liyy\.m2\repository\org\bouncycastle\bcprov-jdk15on\1.52\bcprov-jdk15on-1.52.jar;C:\Users\liyy\.m2\repository\javax\mail\mail\1.4.7\mail-1.4.7.jar;C:\Users\liyy\.m2\repository\javax\activation\activation\1.1\activation-1.1.jar;C:\Users\liyy\.m2\repository\net\sf\json-lib\json-lib\2.4\json-lib-2.4-jdk15.jar;C:\Users\liyy\.m2\repository\commons-beanutils\commons-beanutils\1.9.3\commons-beanutils-1.9.3.jar;C:\Users\liyy\.m2\repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;C:\Users\liyy\.m2\repository\commons-lang\commons-lang\2.5\commons-lang-2.5.jar;C:\Users\liyy\.m2\repository\commons-logging\commons-logging\1.1.1\commons-logging-1.1.1.jar;C:\Users\liyy\.m2\repository\net\sf\ezmorph\ezmorph\1.0.6\ezmorph-1.0.6.jar;C:\Users\liyy\.m2\repository\ch\qos\logback\logback-classic\1.1.11\logback-classic-1.1.11.jar;C:\Users\liyy\.m2\repository\ch\qos\logback\logback-core\1.1.11\logback-core-1.1.11.jar;C:\Users\liyy\.m2\repository\org\springframework\spring-core\4.3.8.RELEASE\spring-core-4.3.8.RELEASE.jar;C:\Users\liyy\.m2\repository\org\springframework\boot\spring-boot\1.5.3.RELEASE\spring-boot-1.5.3.RELEASE.jar" com.nuanshui.frms.native1.thread.ThreadScopeShareData
Thread-0买到:0张票
Thread-1买到:4张票
Thread-1买票后剩余:96张票
Thread-0买票后剩余:100张票
Thread-1,data:96
Thread-0,data:100
Thread-1,data:100
Thread-0,data:100
说明出现了多并发问题。这个时候引入一个java1.5的ConcurentHashMap<线程名称,共享变量>
private static ConcurrentHashMap<String,Integer> concurrentHashMap = new ConcurrentHashMap<String,Integer>();
public static int ticket = 100;
private static ConcurrentHashMap<String,Integer> concurrentHashMap = new ConcurrentHashMap<String,Integer>();
// public static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
public static void main(String[] args){
for(int i=0;i<2;i++){
new Thread(new Runnable() {
@Override
public void run() {
int buy = new Random().nextInt(10);
System.out.println(Thread.currentThread().getName()+"买到:"+buy+"张票");
int temp = ticket-buy;
System.out.println(Thread.currentThread().getName()+"买票后剩余:"+temp+"张票");
ticket = temp;
concurrentHashMap.put(Thread.currentThread().getName(),data);
// threadLocal.set(data);
new ThreadScopeShareData().getData1();
new ThreadScopeShareData().getData2();
}
}).start();
}
}
concurrentHashMap.put(Thread.currentThread().getName(),data);关键代码将当前线程对应的数据放入到map中。
java提供了一个另外一个对象threadLocal.它默认将当前线程设置为key.直接调用set和get方法获取共享变量保证线程安全。
上一篇: 线程安全——线程之间互不影响
下一篇: 线程安全及实现