Java线程安全问题(sychronized) java线程安全thread 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我错了``````应该是这样的,那个是开始的时候写的,还没懂什么是多线程````public class ThreadDemo2 { public static void main(String[] args) { Ticket t1 = new Ticket(); new Thread(t1).start(); new Thread(t1).start(); new Thread(t1).start(); new Thread(t1).start(); }}class Ticket implements Runnable{//extends Thread { private static int ticket =1; Object obj = new Object(); public void run() { while(true) { //synchronized (obj) { if (ticket < 1000) { System.out.println(Thread.currentThread().getName() + "--->" + ticket); ticket++; } else break; //} } }} 试了,而且从理论上讲的话,静态变量在内存中是唯一的啊,也没错啊。开始的程序写错了````正因为是唯一的,多个线程在对其进行读写操作的时候,就会出现时间差:比如某时刻value=10,两个线程同时对其操作,想各自占用一张票,如果没有锁,同时读value得到10,然后各自占用一个,减1操作,各自都认为该写9进去。synchronized的作用就是“互斥使用”:一个线程获得资源的锁,读写过程中,另外一个线程会等待该资源锁释放了,才进行后续操作。有时候机器性能太好了,int型参数操作很快,体现不出来,建议LZ在案例中,读取、加减操作时,Thread.sleep()那么一小会儿,可能就体现出来并发问题了。 正是因为他唯一,..所以才有问题楼主首先你要明白程序不出错不代表他没错,很可能是逻辑意义上的错误假设我有200张火车票,我起2个线程去拿,每个线程步骤四这样的1、判断还有多少张火车票2. 获取火车票,票数建议很可能存在这样的情况 比如当前A 获取到火车票还剩最后1张,开始执行第二步操作,但是还没执行,我们知道线程的执行很多时候是轮片执行的可能存在这样的情况,当A结束第一步,还没开始第二步的时候,停止执行,轮到B执行,而B执行完了1,2两步,这个时候,A再去拿...是没有票的.....这个是所谓脏读的概念,所以才要进行同步,而且对同一个变量进行同步的时候你要注意你的同步监视器对象必须是同一个,才能达到同步的效果。 public void run() { while(true){ synchronized (r) { if(!r.flag)//true----有输入了。 try { r.wait(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(r.name + "-----" + r.sex); r.flag = false; r.notify(); } } }还遇到个问题,synchronized(r)和r,wait(),r.notify()这三个必须是r吗?为什么啊? 试了,而且从理论上讲的话,静态变量在内存中是唯一的啊,也没错啊。开始的程序写错了````正因为是唯一的,多个线程在对其进行读写操作的时候,就会出现时间差:比如某时刻value=10,两个线程同时对其操作,想各自占用一张票,如果没有锁,同时读value得到10,然后各自占用一个,减1操作,各自都认为该写9进去。synchronized的作用就是“互斥使用”:一个线程获得资源的锁,读写过程中,另外一个线程会等待该资源锁释放了,才进行后续操作。有时候机器性能太好了,int型参数操作很快,体现不出来,建议LZ在案例中,读取、加减操作时,Thread.sleep()那么一小会儿,可能就体现出来并发问题了。嗯,开始理解错了。就想着静态的,那么访问是唯一的`````已经试过了,静态是不行的。Thanks 下拉菜单问题。急!!!!!!!! 正则表达式提取html串的问题 全局变量? 我的myeclipse6.0集成的,配置好tomcat6.0启动出现以下问题,求救?? 为什么用javamail向163发送邮件,每封信都带有一个附件的符号??? 发现社区的一个问题!!!!!! JSP中自定义标签嵌套的问题,请高手指教:) 一对多的缓存容器~~~~ extjs问题求解 请问一个String数组转换为Object类型的问题 将项目从JBoss下面移植到tomcat SSH项目中请求servlet结果报错找不到action
应该是这样的,那个是开始的时候写的,还没懂什么是多线程````
public class ThreadDemo2 {
public static void main(String[] args) {
Ticket t1 = new Ticket();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
}
}class Ticket implements Runnable{//extends Thread {
private static int ticket =1;
Object obj = new Object();
public void run() {
while(true) {
//synchronized (obj) {
if (ticket < 1000) {
System.out.println(Thread.currentThread().getName()
+ "--->" + ticket);
ticket++;
}
else
break;
//}
}
}
}
正因为是唯一的,多个线程在对其进行读写操作的时候,就会出现时间差:比如某时刻value=10,两个线程同时对其操作,想各自占用一张票,如果没有锁,同时读value得到10,然后各自占用一个,减1操作,各自都认为该写9进去。synchronized的作用就是“互斥使用”:一个线程获得资源的锁,读写过程中,另外一个线程会等待该资源锁释放了,才进行后续操作。
有时候机器性能太好了,int型参数操作很快,体现不出来,建议LZ在案例中,读取、加减操作时,Thread.sleep()那么一小会儿,可能就体现出来并发问题了。
每个线程步骤四这样的
1、判断还有多少张火车票
2. 获取火车票,票数建议很可能存在这样的情况
比如当前A 获取到火车票还剩最后1张,开始执行第二步操作,但是还没执行,
我们知道线程的执行很多时候是轮片执行的
可能存在这样的情况,当A结束第一步,还没开始第二步的时候,停止执行,轮到B执行,而B执行完了1,2两步,这个时候,A再去拿...是没有票的.....这个是所谓脏读的概念,所以才要进行同步,而且对同一个变量进行同步的时候你要注意你的同步监视器对象必须是同一个,才能达到同步的效果。
while(true){
synchronized (r) {
if(!r.flag)//true----有输入了。
try {
r.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(r.name + "-----" + r.sex);
r.flag = false;
r.notify();
}
}
}
还遇到个问题,synchronized(r)和r,wait(),r.notify()这三个必须是r吗?为什么啊?
正因为是唯一的,多个线程在对其进行读写操作的时候,就会出现时间差:比如某时刻value=10,两个线程同时对其操作,想各自占用一张票,如果没有锁,同时读value得到10,然后各自占用一个,减1操作,各自都认为该写9进去。synchronized的作用就是“互斥使用”:一个线程获得资源的锁,读写过程中,另外一个线程会等待该资源锁释放了,才进行后续操作。
有时候机器性能太好了,int型参数操作很快,体现不出来,建议LZ在案例中,读取、加减操作时,Thread.sleep()那么一小会儿,可能就体现出来并发问题了。
嗯,开始理解错了。就想着静态的,那么访问是唯一的`````已经试过了,静态是不行的。Thanks