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){} JAVA泛型如何定义自身这个语义? ArrayList问题... JAVA模拟按键精灵的问题 十进制转十六进制 一个Socket的Client端的问题,想了很久。 准备今天晚上递辞职信 java中AWT事件处理机制的。 java.util.Date java.sql.Date java.util.Calendar的转换问题。 再问JFC问题?? 1 高分求救!!在线等!!立刻给分! 谢谢 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){}