java同步机制 本帖最后由 Neutrino23 于 2012-02-15 17:03:05 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 理论部分就让别人来回答吧,我来回答你举的例子class MyRunnable implements Runnable{ private int ticket=5; public void run() { for(int i=0;i<100;i++) { synchronized(this) //判断ticket前先将该对象锁住,防止当ticket=1时三个线程又同时减1将ticket变为负数 { if(ticket>0) { try { Thread.sleep(300); } catch(InterruptedException e) { e.printStackTrace(); } System.out.println("ticket="+ticket--); } } } }}public class Demo{ public static void main(String[] args) { MyRunnable myr=new MyRunnable(); Thread t1=new Thread(myr); Thread t2=new Thread(myr); Thread t3=new Thread(myr); t1.start(); t2.start(); t3.start(); }} 如果我建立三个Myrunnable的实例,然后传入三个线程的构造函数中,是不是就不会有资源共享了?什么是共享资源?在本例中,因为只有一个Myrunnable的实例,因此就只有一个private int ticket=5;也就是说3个线程会同时访问ticket这个成员变量,因此,ticket就是共享资源如果有三个Myrunnable的实例,每一个线程一个实例,当然就不存在共享资源这个说法了,就不会发生线程安全问题了。 嗯,我和楼主在看同一本书。我想借机问一下,如果是多个Myrunnable接口的实例,将ticket设置为static作为共享数据可以吗? 将ticket设置为static作为共享数据,就需要做同步,否则就会出现线程安全问题synchronized(Myrunnable.class){} 继承跟多线程问题 求一个简单但很关键的问题 freshman被IOstream搞晕了 Java 地区时间的问题 找工作的迷茫 寻书 请问这题选什么啊? 那位大哥告诉我java 控制台有啥用? 高分EASY问题,关于布局 java计算器的问题阿? java 中继承后class 修饰符问题! 动手写网络爬虫第一章代码出现警告
class MyRunnable implements Runnable
{
private int ticket=5;
public void run()
{
for(int i=0;i<100;i++)
{
synchronized(this) //判断ticket前先将该对象锁住,防止当ticket=1时三个线程又同时减1将ticket变为负数
{
if(ticket>0)
{
try
{
Thread.sleep(300);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("ticket="+ticket--);
}
}
}
}
}public class Demo
{
public static void main(String[] args)
{
MyRunnable myr=new MyRunnable();
Thread t1=new Thread(myr);
Thread t2=new Thread(myr);
Thread t3=new Thread(myr);
t1.start();
t2.start();
t3.start();
}
}
将ticket设置为static作为共享数据,就需要做同步,否则就会出现线程安全问题
synchronized(Myrunnable.class){}