百度了几下,大致都能把那几句话背了,就是保证同一时刻只能有一个线程执行被synchronized修饰的函数。
可是加不加synchronized有什么区别呢,执行结果是否会不同呢,麻烦举个例才能知道。
如下例子,按照我的理解,应该是一个线程(D1或D2)从1输出到9后,然后另一个线程才从1输出到9后,然后结果是交替输出。麻烦指出一个不加synchronized的不同之处的例子。
package bacd;
public class Demo extends Thread
{
public void run()
{
for (int i = 0; i < 10; i++)
System.out.print(i + " ");
}
public static void main(String[] args)
{
Demo D1 = new Demo();
Demo D2 = new Demo();
D1.start();
D2.start();
}
}
synchronized的使用举例。如果不使用synchronized会怎样?
答案:2 悬赏:0 手机版
解决时间 2021-01-28 07:11
- 提问者网友:末路
- 2021-01-27 14:30
最佳答案
- 五星知识达人网友:未来江山和你
- 2021-01-27 14:56
synchronized是保证线程安全 就是在当多个线程操作同一资源时保证某一时刻只能有一个线程在执行这个任务
你这个虽然开了多个线程 但是并没有操作同一资源
举例吧:买火车票 2个窗口卖 假定有张票的ID为80 如果没有synchronized这个锁来控制 那有可能导致2个窗口同时都把ID为80的这张票卖出去 这不乱套了嘛 那不就有2张ID为80的票了?
有了synchronized就只有当一个窗口卖完了 释放了synchronized这个锁 其他窗口才能来卖票 这时ID为80的票已经被卖出去了 也就只能卖其他的了
至于你说的交替输出 应为CPU在决定哪个线程运行是随时随机跳动的
你这个虽然开了多个线程 但是并没有操作同一资源
举例吧:买火车票 2个窗口卖 假定有张票的ID为80 如果没有synchronized这个锁来控制 那有可能导致2个窗口同时都把ID为80的这张票卖出去 这不乱套了嘛 那不就有2张ID为80的票了?
有了synchronized就只有当一个窗口卖完了 释放了synchronized这个锁 其他窗口才能来卖票 这时ID为80的票已经被卖出去了 也就只能卖其他的了
至于你说的交替输出 应为CPU在决定哪个线程运行是随时随机跳动的
全部回答
- 1楼网友:空山清雨
- 2021-01-27 15:36
//synchromized
package mypackage;
class a {
synchronized void get() {
system.out.println("a");
system.out.println("b");
}
synchronized void put() {
system.out.println("c");
system.out.println("d");
}
}
class get implements runnable {
thread t;
a temp;
get(a a) {
temp = a;
t = new thread(this);
t.start();
}
public void run() {
temp.get();
}
}
class put implements runnable {
thread t;
a temp;
put(a a) {
temp = a;
t = new thread(this);
t.start();
}
public void run() {
temp.put();
}
}
class myjava {
static public void main(string args[]) {
a o = new a();
get o1 = new get(o);
put o2 = new put(o);
try {
o1.t.join();
o2.t.join();
} catch (interruptedexception e) {
system.out.println("interrupted!");
}
}
}
synchronized就是把一个线程调用的方法放在一个锁里面,让别的线程在方法返回前不能调用这个方法,但是要注意put和get里用的是同一个a实例,是由main方法传递上来的
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯